iOS autorelease

autorelease是一个池子pool,声明auto的对象被放在这个pool里,用With创建的对象被创建出来时引用计数就是1,再有一个指针变量指向它,引用计数就是2,当返回这个变量所在的函数时,变量被释放,对象的引用计数-1,但还是1,我们知道,当引用计为0时,对象才会自动释放,aotoreleasepool的作用就是,当pool  drain时,里面的对象引用计数-1,为0的释放。

一个程序可以有多个autorelease pool,auto的对象被放在离他最近定义的pool里(hot_Page,也就是最近创建的pool)。
多个pool被一个双向链表链接起来,pool用page节点表示,每个page指向自己的 POOL_SENTINEL(哨兵对象,代表一个 autoreleasepool 的边界), autoreleasepool里 以栈的形式 存放被auto的对象。
一个 autoreleasepool对象创建的时候调用构造函数(苹果里的push函数),drain的时候调用析构函数(苹果里的Pop函数)
创建时page链表在尾部插入一个page节点,代表一个新的pool,drain时这个结点被删除,节点指向的pool里的对象被release。

autorelease
auto类似于c语言里的作用域,创建一个aoto...pool对象,其他对象调用aotorelease方法这个对象就会被注册到aoto..pool里面,当废弃aoto...pool时,pool里的对象都会release一次,只有在pool销毁时里面的对象才会被销毁。
NSAutoPool要在ARC无效时使用
在ARC下用@aotoreleasepool代替NSAotureleasepool的对象生成,持有,废弃。用对象添加_aoturealsing代替对象调用autorelease方法,注册到pool里。
· 取得非自己生成并持有的对象时(非alloc、new。。。方法取得的对象),返回的对象会自动注册到pool里。
如NSMutableArray的array方法:
+(id)array{
     id obj=[[NSMutableArray alloc]init];
     return obj;
ARC下obj默认是__strong obj强引用,引用计数为1,再注册到autopool里,当return后,obj变量释放,但这个对象不会被销毁,因为他在pool里。
· 被weak变量引用时,对象会被注册到pool里,这是防止访问weak变量时,对象已经被释放,放到pool里,只要pool不废弃,对象就不会被销毁。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值