美文网首页
内存管理(上)

内存管理(上)

作者: 霏誠拜咬o | 来源:发表于2016-07-15 17:28 被阅读0次

内存管理

  • ARC是Swift默认的内存管理机制,其针对堆上的对象,由编译器自动生成操作引用计数的指令(retain或release)来管理对象的引用计数增加或减少。程序员无法手工控制。
  • 哪些类型的对象收ARC管理
    • 类class
    • 闭包closure
  • 哪些对象不受ARC管理
    • 基础数值类型
    • 结构struct
    • 枚举enum
    • 元组tuple
class FileStream{
  init(){
    print("open file...")
  }    
  func process(){
    print("process file...")
  }
  deinit{
    print("close file...")
  }
}
class MyClass1{
  var stream:FileStream?
}
class MyClass2{
  static var stream:FileStream?
}
var fs1:FileStream() // r(1)

var mc:MyClass1?
mc!.stream=fs1 // r(2)

MyClass2.stream=fs1 // r(3)

fs1?.process()

fs1=nil //r(2)
mc!.stream=nil //r(1)
Myclass2.stream=nil // r(0)

图示引用计数.png

关于Auto Release

  • Swift原生对象不支持autorelease消息,也就没有必要使用Autorelease Pool来管理内存峰值。
  • 如果Swift调用Objective-C函数返回autorelease对象,那么如果出现内存峰值过高的风险,仍然需要使用Autorelease Pool来管理。
  • Autorelease Pool在Swift中使用尾随闭包形式实现。
import Foundation

class FileStream{
  init(){
    print("open file...")
  }    
  func process(){
    print("process file...")
  }
  deinit{
    print("close file...")
  }
}
func getStream()-> FileStream?{
  var fs:FileStream?

  fs=FileStream()
  return fs;
}
func useNativeSwiftObject(){
  for index in 0...10{
    print("\(index) for start...")
      var stream=getStream()
      stream?.process()
      stream=nil
      print("\(index) for end...\n")
  }
}
/*
func useObjecAutoreleaseObject(){
  if let filepath = NSBundle.mainBundle().pathForResource("2015",ofType:"jpg"){
    for _ in 0..<5{
      autoreleasepool{
        for _ in 0..<1000{
          let data=NSdata.dataWithContentsOfMappedFile(filepath)
        }
      }
    }
  }
}
*/
print("\n......invoke......\n")
useNativeSwiftObject()
print("......continue......")

循环引用于内存泄露

  • 对象间的循环引用会造成ARC引用计数无法释放被引用的任何一个对象,从而造成内存泄露。

  • 解决循环引用造成的内存泄露有三种方式:
    1.在合适的地方,手动将循环引用解除。
    2.如果允许对象引用为nil,可将引用声明为弱引用(weak)
    3.如果不允许对象引用为nil,可将对象声明为无主引用(unowned)

  • 弱引用在对象被释放后,ARC会将引用设置为nil。无主引用在对象被释放后,ARC不会设置nil,访问时会抛运行时错误(空悬指针)。

class Computer{
  var name: String
  var display: Monitor?
  init(name:String){
    self.name=name
    print("Computer init")
  }
  deinit{
    print("Computer deinit")
  }
}
class Monitor{
  var no: Int
  weak var device: Computer?
  init(no:Int){
    self.no=no
    print("Monitor init")
  } 
  deinit{
    print("Monitor deinit")
  }
}

var imac:Computer?
var screen:Monitor?
imac=Computer(name:"Jason's iMac")
screen=Monitor(no:29)

imac!.display=screen
screen!.device=imac

//imac!.display=nil

imac=nil
screen=nil

循环引用.png 避免循环引用:弱引用.png
import Foundation

class Car{
  var name:String
  var engine:Engine?
  init(name:String){
    self.name=name
    print("Car init")
  }
  deinit{
    print("Car deinit")
  }
}
class Engine{
  var no:Int
  unowned var car : Car
  init(no:Int,car : Car){
    self.no=no
    self.car=car
    print("Engine init")
  }
  deinit{
    print("Engine deinit")
  }
}
var bmw:Car?
var engine:Engine?

bmw=Car(name:"BMW")
engine=Engine(no:400,car:bmw!)

bmw!.engine=engine

bmw=nil
//engine=nil
避免循环引用:无主引用.png

相关文章

  • 内存管理(上)

    内存管理 ARC是Swift默认的内存管理机制,其针对堆上的对象,由编译器自动生成操作引用计数的指令(retain...

  • 内存管理(上)

    内存五大区 内存布局 当程序运行时,系统会开辟三个区,分别是:内核区、程序使用的内存五大区和保留区。操作系统分为两...

  • iOS内存管理篇(二)---NSAutoreleasePool/

    前言:上一篇内存管理里面, iOS内存管理篇(一)--alloc/reatain/release/dealloc方...

  • 基本知识摘录

    一:内存管理的理解首先iOS中数据是存贮在堆和栈中的。内存管理需要管理堆上的内存,栈上的内存并不需要我们管理。非O...

  • iOS 内存管理(上)

    什么是内存管理 程序在运行过程中通常会有以下行为,来增加程序的内存占用 创建一个对象 定义一个变量 调用一个函数或...

  • ios 内存管理(上)

    1.内存布局 内核区:假设在4GB的手机内存中,通常我们使用的只有3GB,而另外的1GB则交给内核区去处理; 栈:...

  • iOS/OS X内存管理(二):借助工具解决内存问题

    上一篇博客iOS/OS X内存管理(一):基本概念与原理主要讲了iOS/OSX 内存管理中引用计数和内存管理规则,...

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • iOS 开发基础(1)--内存管理

    内存管理的作用:实质就是管理堆(自己申请,自己释放)空间上的内存;在恰当的时候销毁对象的内存空间;合理使用内存,保...

  • iOS-《编写高质量代码》笔记 第三章-内存管理

    建议17:理解内存和Objective-C内存管理规则 OC 内存管理模式基于对象的“所有权”上。任何对象都会被一...

网友评论

      本文标题:内存管理(上)

      本文链接:https://www.haomeiwen.com/subject/ywosjttx.html