每天进步一点点2

今天要说的是AutoreleasePool 的数据结构

其实AutoreleasePool 的本质是一个指向AutoreleasePage 双向链表的一个指针。

1,AutoreleasePool 的初始化是怎么样的?
例如@autoreleasePool {
//做了什么1:
void *atautoreleasepoolobj = objc_autoreleasePoolPush();
创建了autoreleasePage节点,并进了一个“POOL_SENTINEL”进去page里面做哨兵
//做了什么2
objc_autoreleasePoolPop(atautoreleasepoolobj);
释放哨兵之前的那些object
}

2,Autorelease 做了什么操作
可以看到同样是调用了autoreleaseFast这个函数,这个函数做了什么?
1,page有空闲地方,直接插入,更新栈顶
2,page没有空闲,新建page,然后插入,
3,没有page,新建page,然后插入。

3,objc_autoreleasePoolPop(atautoreleasepoolobj); 做了什么?
它就把哨兵前面的object全部都出栈。

4,子线程和 autoreleasepool 的关系?

这么回答吧:子线程和runloop是一一对应的,子线程开启了runloop之后,runloop 会维护一份自己的Autoreleasepool,所以子线程里面的autorelease的对象就会由这个autoreleasepool 去控制什么时候pop掉。
如果子线程没有开启runloop呢?那么autorelease的对象怎么办呢?同样会添加到autoreleasePool结构里面的autoreleasePage里面。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 内存的引用   计算机是按地址访问数据,如果一块内存被使用,就必须让外界知道它在哪儿,反过来讲,要访问一个数据就必...
    吸血鬼de晚餐阅读 2,178评论 0 5
  • 26. 什么是KVC和KVO? KVO: iOS开发-KVO的奥秘 http://www.jianshu.com/...
    烟雨平生花飞舞阅读 411评论 0 2
  • 今天的句子: Such stereotypes about spoiled, lonely and peculia...
    阿飞fighting阅读 541评论 0 0
  • SQLServer2008的导出脚本方法: 数据库名-->右键 任务-->生存脚本,之后弹出SQLServer脚本...
    神木惊蛰阅读 1,445评论 0 1

友情链接更多精彩内容