对autorelease的理解

一.对于autorelease pool本身,会在什么条件下会被释放

1.手动释放Autorelease pool

2)Runloop结束后自动释放


二.对于autorelease pool内部的对象,会在什么条件下被释放

在retain == 0的时候释放

注意:autorelease结束,只是对释放池中的对象release一次,对象并不一定会被释放


三.autorelease的原理

       要搞懂具体原理,则要先要搞清楚 autorelease 何时会创建。 我们的程序在main()调用的时候会自动调用一个 autorelease,然后在每一个 Runloop, 系统会隐 式创建一个 Autorelease pool,这样所有的 release pool 会构成一个象CallStack 一样的一个栈式 结构,在每一个 Runloop 结束时,当前栈顶的Autorelease pool(main()里的 autorelease)会被 销毁,这样这个 pool 里的每个Object 会被 release
可以把
autorelease pool 理解成一个类似父类与子类的关系,main()创建了父类,每个 Runloop 自 动生成的或者开发者自定义的 autorelease pool 都会成为该父类的子类。当父类被释放的时候, 没有被释放的子类也会被释放,这样所有子类中的对象也会收到 release 消息。 那什么是一个 Runloop ? 一个 UI 事件,Timer call, delegate call, 一个鼠标事件,键盘按 下(MAC OSX),或者iphone 上的触摸事件,异步 http 连接下后当接收完数据时,都会是一个新的Runloop。 一般来说,消息循环运行一次是毫秒级甚至微秒级的,因此autorelease 的效率仍然是非常高的, 确实是一个巧妙的设计。 


例题:

NSObject *temp = [[[NSObject alloc]init]autorelease];请问temp什么时候会被释放

答:temp的retainCount为0时,会被释放




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值