面试题答案
一键面试自动释放池的工作原理
- 数据结构:自动释放池实际上是一个由
NSAutoreleasePoolPage
类组成的双向链表。每个NSAutoreleasePoolPage
对象都是一个栈结构,对象的自动释放操作就是将对象压入当前自动释放池页的栈中。 - 嵌套结构:可以有多个自动释放池嵌套使用,当一个自动释放池被创建时,它会在链表中成为当前自动释放池。新的对象自动释放时会被添加到当前自动释放池对应的栈中。
在内存管理中起到的作用
- 延迟释放:对象调用
autorelease
方法后,并不会立即释放内存,而是被放入自动释放池。这使得对象在当前作用域内仍然可用,而在合适的时机再进行释放,从而避免在复杂的方法调用链中过早释放对象导致悬空指针等问题。 - 优化内存峰值:对于大量临时对象的创建,例如在循环中创建大量临时对象,如果没有自动释放池,所有对象可能会同时占用内存,导致内存峰值过高。而通过自动释放池,可以在适当的时候释放这些临时对象,降低内存峰值。
何时会自动释放池中的对象
- 自动释放池销毁时:当自动释放池被销毁(例如超出其作用域),会向池中的所有对象发送
release
消息。如果对象的引用计数降为0,则对象的内存会被释放。 - 手动释放:也可以通过在自动释放池块内手动调用
[pool drain]
(在ARC环境下不推荐,MRC环境可用)或[pool release]
来提前释放自动释放池及其包含的对象。在ARC环境下,编译器会自动插入释放自动释放池的代码,一般不需要手动干预。