AutoreleasePool的实现

91 阅读1分钟

每个runloop中都会创建一个 autoreleasepool 并在runloop迭代结束进行释放。

自动释放池实际上是一个由 AutoreleasePoolPage 组成的双向链表结构, 一个自动释放池中有一个或多个 AutoreleasePoolPage 节点, 每个节点除了有本类的成员之外, 还有系统分配的一些内存,这些内存用来存储 Autorelease 变量地址的. 每当有对象被标记为 Autorelease 时, 该对象的地址就会存入对应的 AutoreleasePoolPage 中预留好的地址里, 如果一个 AutoreleasePoolPage 节点预留的地址空间已满, 就会重新生成一个新的节点放入链表中, 然后在新的节点中加入 Autorelease 对象地址.

关键就是 objc_autoreleasePoolPush()objc_autoreleasePoolPop() 两个函数. 可以说是该自动释放池从 objc_autoreleasePoolPush() 开始, 期间的 autorelease 类型的对象都会加入到这个自动释放池中, 最后在 objc_autoreleasePoolPop() 调用时, 释放掉池中所有的 autorelease 对象.