一、AutoreleasePool是什么
AutoreleasePool(自动释放池)是OC中的一种内存自动回收机制,它可以延迟加入AutoreleasePool中的变量release的时机。在正常情况下,创建的变量会在超出其作用域的时候release,但是如果将变量加入AutoreleasePool,那么release将延迟执行。
二、使用场景
ARC时代,在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop。
1、降低内存使用峰值:
这一点不用多说,当你使用类似for循环这样的逻辑需要产生大量的中间变量时,Autorelease Pool无意是最佳的一种解决方案;2、如果是对NSArray操作,如果可以的话推荐使用OC提供的以下api:
- (void)enumerateObjectsUsingBlock:
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:
- (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:
3、 如果你正在编写不基于UI 框架的程序,比如命令行工具。
4、 你生成了一个辅助线程。 一旦线程开始执行你必须自己创建自动释放池。否则,应用将泄漏对象。
三、实现原理
每个Cocoa的线程都会默认标配一个Autorelease Pool,但是你也可以手动创建多个。从前面的操作中,也应该能隐约猜出来了些许,有push和pop操作,意味着每个pool的管理其实是一种类似栈结构的进栈出栈操作,当然pool的管理更复杂些,因为它可以创建多个,还可以嵌套创建删除
具体实现:实现原理(参考1)
实现原理(参考2)