苹果是如何实现autoreleasepool的?

arc下编译器会优化成

void *context = objc_autoreleasePoolPush();
// {}中的代码
objc_autoreleasePoolPop(context);

向一个结构AutoreleasePoolPage,中写入需要自动释放的对象,类似一种标记,调用objc_autoreleasePoolPop(context)后,就会把这中间的对象release一下。
这里要注意的是,方法返回值是怎么做到自动释放的?
其使用Thread Local Storage(TLS)线程局部存储,每次存入线程或者从线程取出来。
我们没有卸载{}中的自动释放对象,会在每个runloop结束时候去释放,相当于一个大的autoreleasepool中。

可以看看这篇文章 http://blog.sunnyxx.com/2014/10/15/behind-autorelease/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 26. 什么是KVC和KVO? KVO: iOS开发-KVO的奥秘 http://www.jianshu.com/...
    烟雨平生花飞舞阅读 382评论 0 2
  • 目录 autorelease的本质 autorelease对象什么时候释放? autoreleasepool的工作...
    yanhooIT阅读 5,184评论 5 35
  • autoreleasepool 以一个栈的形式实现,主要通过下列三个函数完成. 看函数名就可以知道,对 autor...
    飘金阅读 453评论 0 1
  • 一片草原,是我的天堂 我驱赶着这只只的羊儿 追寻的,都是那夜我曾在草原上看过你的梦魇
    失天翼阅读 233评论 0 1
  • 边缘光/轮廓光,暗光 想要不绘制轮廓线来强调物体的轮廓,且不希望它看上去是缺乏写实性的卡通风格,那么可以试一试添加...
    _Z_阅读 1,516评论 0 0