(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 线程。
(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、多层嵌套调用就是多次插入哨兵对象。
网友评论