-
Notifications
You must be signed in to change notification settings - Fork 8
Open
Description
简单说AutoReleasePool是一个双向链表,它是由一个一个AutoreleasePoolPage链接而成,AutoreleasePoolPage包含两部分,一部分用于存储当前AutoreleasePoolPage的描述,另一部分用于存储加入AutoreleasePool的对象。
class AutoreleasePoolPage
{
//.....
magic_t const magic;
id *next;
pthread_t const thread;
AutoreleasePoolPage * const parent;
AutoreleasePoolPage *child;
uint32_t const depth;
uint32_t hiwat;
//...
}上面的结构体中
- magic用于校验该AutoreleasePoolPage是否完整。
- thread用于指向当前的线程。
- next指向最新添加的 autoreleased 对象的下一个位置。
- parent 指向父结点,第一个结点的 parent 值为 nil;
- child 指向子结点,最后一个结点的 child 值为 nil;
每当我们创建一个局部释放池的时候,就会调用objc_autoreleasePoolPush方法。这时候就会在AutoReleasePool中增加一个哨兵对象,并作为_objc_autoreleasePoolPush的返回值传出,以供objc_autoreleasePoolPop作为参数,将整个局部释放池全部清空。
Metadata
Metadata
Assignees
Labels
No labels