-
有两个observer会监听runloop两个事件,一个observer监听runloop要进入的是时候entry,会调用pool push方法创建一个autorelease pool
-
另一个observer监听runloop的状态,当runloop要进入休眠状态时beforewaiting,会pop一个自动释放池,同时push创建一个新的自动释放池。
-
AutoreleasePoolPage 结构
arduinoclass AutoreleasePoolPage { const magic id *next 指向下一个可以存放被释放对象的地址 pthread_t const thread 当前所在的线程 AutoreleasePoolPage *const parent 当前page的父节点 AutoreleasePoolPage *child }
-
每个page占4096个字节也就是4kb,自身成员变量只占56个字节,也就是7个成员变量,每个成员变量占8个字节。其他四千多个字节都是用来存放被autorelease修饰的对象内存地址。
-
pool_boundary的作用是区分不同自动释放,调用push时,会传入一个pool_boundary并返回一个地址,这个地址不存储@autorelease对象的地址,起到一个标识作用,用来分隔不同的autoreleasepool
-
调用pop的时候,会传入end地址,从后到前调用对象的release方法,直到pool_boundary为止。
-
如果存在多个page,会从child的page最末尾开始调用,直到pool_boundary
-
page是一个栈结构,释放是从栈顶开始
-
多层嵌套会共用一个page,通过pool_boundary来分隔,优先释放在里层的pool,因为最里层的pool中的对象被放倒了栈顶,优先释放栈顶对象。
swift@autoreleasepool { NSObject *p1 = [[NSObject alloc] init] NSObject *p2 = [[NSObject alloc] init] @autoreleasepool { NSObject *p3 = [[NSObject alloc] init] @autoreleasepool{ NSObject *p4 = [[NSObject alloc] init] } } }

- 释放时机:如果通过代码添加一个autoreleasepool,在作用域结束时,随着pool的释放,就会释放pool中的对象,这种情况是几十释放的,并不依赖于runloop。另一个就是系统自动释放的,系统会在runloop开始的时候创建一个pool,结束的时候会对pool中对象执行release操作。
- autoreleasepool 和 runloop的关系
