Skip to content

简要介绍下 @autoreleasePool 的数据结构? #20

@tbfungeek

Description

@tbfungeek

简单说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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions