AutoreleasePool 的相关问题

(1)Autoreleasepool的实现原理:

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

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 线程。

AutoreleasePool 的相关问题

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、多层嵌套调用就是多次插入哨兵对象。

 

更多技术信息和资源请关注《大前端自学网》http://coderzx.com/