autorelease, autoreleasePool

问题:

  1. autorelease对象什么时候释放?
  2. runloop中 autoreleasePool什么时候生成和销毁?

顾名思义,autorelease就是自动释放. 这看上去很像ARC,但是它更类似于C语言中的自动变量(局部变量)的特征.
autorelease会像C语言的自动变量那样来对待实例变量.当超出其作用域时,对象实例的release实例方法就会被自动调用. 无需再手动release一次对象.

objective-C高级编程 iOS与OS X多线程和内存管理

代码实现

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这一块,一直缺少动手实践. 也有很多不太明白的地方,总之,尽量少欠技术债吧. 晚安!

参考:

  1. https://www.jianshu.com/p/5ef8f28025b9
  2. http://www.cnblogs.com/xiaobai51/p/5885598.html

你可能感兴趣的:(autorelease, autoreleasePool)