AutoreleasePool 的相关问题

2020-04-25  本文已影响0人  荷码人生

(1)Autoreleasepool的实现原理:

双向链表

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

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

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

(3) autoReleasePoolPage 的数据结构:

AutoReleasePoolPage 的数据结构图

(4)autoReleasePoolPage::push的实现:

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

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

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

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

(6)autoReleasePoolPage::pop的实现:

总结

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

上一篇 下一篇

猜你喜欢

热点阅读