问题:
- autorelease对象什么时候释放?
- runloop中 autoreleasePool什么时候生成和销毁?
顾名思义,autorelease就是自动释放. 这看上去很像ARC,但是它更类似于C语言中的自动变量(局部变量)的特征.
autorelease会像C语言的自动变量那样来对待实例变量.当超出其作用域时,对象实例的release实例方法就会被自动调用. 无需再手动release一次对象.
代码实现
NSAutoreleasePool * pool = [NSAutoreleasePool alloc] init ];
id obj = [NSObject alloc]init];
[obj autorelease];//此时obj 并不会立即[obj release]
[pool drain];//相当于执行[obj release];在废弃NSAutoreleasePool对象时,都将调用release方法.
注:autoreleasePool在MRC中是通过生成NSAutoreleasePool对象和废弃([pool drain]),来开始和结束autoreleasePool对象和结束autoreleasePool对象的.在ARC中,则使用@autoreleasePool块代替.
在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop.
现在回答第二个问题:autoreleasePool什么时候生成和销毁?
回答:当开启或者唤醒runloop的时候,会创建一个autoreleasePool;kCFRunLoopBeforeWaiting | kCFRunLoopExit,即当runloop睡眠之前或者退出runloop的时候会释放autoreleasePool;
因为 autoreleasepool 没有监听 RunLoop 即将唤醒的状态,所以在休眠之前创建好,但是如果 RunLoop 不被唤醒了 , 最后一次创建的释放池就不会被销毁,所以监听 kCFRunLoopExit 状态,在最后退出的时候销毁最后一次创建的释放池
对runloop这一块,一直缺少动手实践. 也有很多不太明白的地方,总之,尽量少欠技术债吧. 晚安!
参考: