每个runloop中都会创建一个 autoreleasepool 并在runloop迭代结束进行释放。
自动释放池实际上是一个由 AutoreleasePoolPage 组成的双向链表结构, 一个自动释放池中有一个或多个 AutoreleasePoolPage 节点, 每个节点除了有本类的成员之外, 还有系统分配的一些内存,这些内存用来存储 Autorelease 变量地址的. 每当有对象被标记为 Autorelease 时, 该对象的地址就会存入对应的 AutoreleasePoolPage 中预留好的地址里, 如果一个 AutoreleasePoolPage 节点预留的地址空间已满, 就会重新生成一个新的节点放入链表中, 然后在新的节点中加入 Autorelease 对象地址.
关键就是 objc_autoreleasePoolPush() 和 objc_autoreleasePoolPop() 两个函数. 可以说是该自动释放池从 objc_autoreleasePoolPush() 开始, 期间的 autorelease 类型的对象都会加入到这个自动释放池中, 最后在 objc_autoreleasePoolPop() 调用时, 释放掉池中所有的 autorelease 对象.