作者:手机用户2602913921 | 来源:互联网 | 2023-09-25 23:23
一.了解ARCARC:自动引用计数(AutomaticReferenceCounting)是Objective-C默认的neicun管理机制,其针对堆上的对象,由编译器自动
一.了解ARC
ARC:自动引用计数(Automatic Reference Counting)是Objective-C默认的neicun管理机制,其针对堆上的对象,由编译器自动生成操作引用计数的指令(retain或者release),来管理对象的创建和释放
1).哪些对象受ARC的管理:
a.OC对象指针
b.Block指针
c.使用attribute((NSObject))定义的typedef
2).哪些对象不收ARC的管理
a.值类型(简单值类型,C语言struct)
b.使用其他方式分配的堆对象(使用c语言的malloc分配)
c.非内存资源
二.引用计数管理
1).新创建(使用alloc,new,copy等)一个引用类型对象,引用计数为1
2).对象引用计数增1——–retain操作:
a.将对象引用赋值给其他变量或者常量
b.将对象引用赋值给其他属性或者实例变量
c.将对象传递给函数参数,或者返回值
d.将对象加入到集合中
3).对象引用计数减1——–release操作:
a.将局部变量或者全局变量赋值为nil或者其他值
b.将属性赋值为nil或其他值
c.实例属性所在的对象被释放
d.参数或者局部变量离开函数
e.将对象从集合中删除
4).引用计数为0时,内存自动释放
三.自动释放池
1).release会导致对象立即释放,如果频繁对对象进行release,可能会造成琐碎的内存管理负担。autorelease可以将release的调用延迟到自动释放池被释放时。
2).推荐使用自动释放池(Autorelease Pool)Block,当期结束时,所有接受autorelease消息的对象将会被立即释放(即发送release消息)
3).AppKit和UIKit框架在处理每一次事件循环迭代时,都会将其放入一个Autorelease Pool中。大多数情况,开发人员无需处理。
四.什么时候需要手工管理Autorelease Pool
1).编写的程序不基于UI框架,如命令行程序
2).在循环中创建大量临时对象,需要更早地释放,避免临时对象聚集导致内存峰值过大
1).在主线程之外创建新的线程,在新线程开始执行处,需要创建自己的Autorelease Pool
1).可以嵌套使用Autorelease Pool