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默认是开启的,可以手动关闭。

 

posted @ 2016-03-25 21:44  dom075  阅读(173)  评论(0编辑  收藏  举报