objective-C学习笔记(九)ARC
ARC叫自动引用计数Automatic Reference Counting。针对堆上的对象,管理对象的创建和释放。
哪些对象受ARC管理:
OC对象指针
Block指针
使用_attribute_(NSObject定义的typedef
哪些对象不受ARC管理:
值类型(简单值类型,如C语言struct)
使用其他方式分配的堆对象(如malloc分配)
非内存资源
引用计数管理
新创建(使用alloc、new、copy等)一个引用计数类型对象,引用计数为1.
对象引用计数增1----retain操作:(其实就是把当前对象的地址赋值出去,成为一个指针的时候。
将对象引用赋值给其他变量或常量。
将对象引用赋值给其他属性或者实例变量。
将对象传递给函数参数,或者返回值。
将对象加入集合中。
对象引用计数减1----ralease操作 (其实就是指向这个对象的指针销毁的时候)
将指向这个对象的局部变量或全局变量赋值为nil或其他值。
将指向这个对象的属性赋值为nil或其他值。
实例属性所在的对象被释放。(就是某个对象的属性指向这个堆,当这个对象销毁的时候,自然指针也销毁了)
参数或局部变量离开函数。(函数结束了,自然指针也销毁了)
将对象从集合中删除。
引用计数变为0时,内存自动被释放
自动释放池(Autorelease Pool)
release 会导致对象立即释放。如果频繁对对象进行release,可能会造成琐碎的内存管理负担。autorelease可以将release 的调用延迟到自动释放池被释放时。
推荐使用自动释放池(Autorelease Pool)Block,当其结束时,所有接受autorelease消息
AppKir和UIKit框架在处理每一次事件循环迭代时,都会将其放入一个Autorelease Pool中。大多数情况,无需程序员干预。
什么时候需要手工管理Autorelease Pool?
编写的程序不基于UI的框架,比如命令行程序。
在循环中创建大量临时对象,需要更早的释放,避免临时对象聚集导致内存峰值过大。
在主线程之外创建新的线程,在新线程开始执行处,需要创建自己的Autorelease Pool。
可以嵌套使用Autorelease Pool.
ARC默认是开启的,可以手动关闭。