Autorelease对象什么时候释放?
在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的,
而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop
当然,我们也可以手动添加@autoreleasepool
干预Autorelease对象的释放时机:
1 | - (void)viewDidLoad { |
什么时候用@autoreleasepool
根据Apple的文档,使用场景如下:
- 写基于命令行的的程序时,就是没有UI框架,如AppKit等Cocoa框架时。
- 写循环,循环里面包含了大量临时创建的对象。(本文的例子)
- 创建了新的线程。(非Cocoa程序创建线程时才需要)
- 长时间在后台运行的任务。
利用@autoreleasepool优化循环
利用@autoreleasepool优化循环的内存占用,我觉得最有用的一点,下面就说说这个点。
如下面的循环,次数非常多,而且循环体里面的对象都是临时创建使用的,就可以用@autoreleasepool包起来,让每次循环结束时,可以及时的释放临时对象的内存。
1 | //来自Apple文档,见参考 |
其他
使用容器的block版本的枚举器时,内部会自动添加一个AutoreleasePool:
1 | [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { |
当然,在普通for循环和for in循环中没有,所以,还是新版的block版本枚举器更加方便。for循环中遍历产生大量autorelease变量时,就需要手加局部AutoreleasePool