美文网首页
AutoreleasePool 的相关问题

AutoreleasePool 的相关问题

作者: 荷码人生 | 来源:发表于2020-04-25 21:11 被阅读0次

    (1)Autoreleasepool的实现原理:

    • 以栈为结点,由双向链表的形式合成的数据结构。
    • 与线程一一对应。
    双向链表

    (2)@autoReleasePool经过编译器变异后,成为:

    void * ctx = objc_autoReleasePoolPush(); //ctx 就是哨兵对象所对应的位置。
    {}对应代码;
    objc_autoReleasePoolPop(ctx);

    • objc_autoReleasePoolPush(); 的内部实现:调用了c++中的一个结构体:autoReleasePoolPage::push(void);

    • objc_autoReleasePoolPop(); 内部实现:调用了c++中的AutoReleasePoolPage::pop(void * ctx)函数。

    一次pop 相当于一次批量的pop 操作:pop的时候,就会将{}中变量全部释放一次

    (3) autoReleasePoolPage 的数据结构:

    • next 指向下一个栈中的可填充位置。
    • parent 父指针
    • child 孩子指针
    • pthread_t 线程。
    AutoReleasePoolPage 的数据结构图

    (4)autoReleasePoolPage::push的实现:

    根据next指针找到栈中可以进行填充的位置,然后在该位置置为nil ,也就是插入了一个哨兵对象。

    push操作:会把当前的next 指向的位置置为nil,也就是哨兵对象。然后将next指针指向下一个可入栈的位置。

    (5)[objc autorelease]方法的具体实现??

    首先会判断,当前next指针是否指向了栈顶。如果说不是栈顶,那就将对象添加到next位置上,结束调用流程。如果说是栈顶,那么就会增加一个栈结点,到链表中,然后在新的栈中添加对象。

    (6)autoReleasePoolPage::pop的实现:

    • 根据哨兵对象,找到对应位置。
    • 给上次push 操作之后添加的对象一次发送release消息。
    • 回退next 指针对象到指定位置。

    总结

    1、在当次runloop将要结束时,调用autoreleasePoolPage::pop()方法。
    2、多层嵌套调用就是多次插入哨兵对象。

    相关文章

      网友评论

          本文标题:AutoreleasePool 的相关问题

          本文链接:https://www.haomeiwen.com/subject/zipiactx.html