AutoreleasePool的原理记录

AutoreleasePool(自动释放池)是OC中的一种内存自动回收机制,它可以延迟加入AutoreleasePool中的变量release的时机。在正常情况下,创建的变量会在超出其作用域的时候release,但是如果将变量加入AutoreleasePool,那么release将延迟执行。

在没有使用@autoreleasepool的情况,autorelease对象是在当前的runloop迭代结束时释放。

每个runloop中都会创建一个 autoreleasepool 并在runloop迭代结束进行释放。

每个runloop中都会创建一个 autoreleasepool 并在runloop迭代结束进行释放。


autoreleasepool对应的线程存储了指向最新page(也就是最新添加autorelease对象的page)的指针。

在自动释放池中每一个AutoreleasePoolPage都是以双链表的形式连接起来的:

每当自动释放池调用objc_autoreleasePoolPush时都会把边界对象放进栈顶,然后返回边界对象,用于释放。

atautoreleasepoolobj = objc_autoreleasePoolPush();

atautoreleasepoolobj就是返回的边界对象

push就是压栈的操作,先加入边界对象然后添加A对象在边界对象之后,下一个B对象压入A对象之后,就像羽毛球筒放羽毛球一样

自动释放池释放是传入 push 返回的边界对象,objc_autoreleasePoolPop(atautoreleasepovolobj);,然后将边界对象指向的这一页 AutoreleasePoolPage 内的对象释放(从栈顶开始操作出栈,并向栈中的对象发送release消息,直到遇到第一个边界对象)

总结:

1.自动释放池是一个个 AutoreleasePoolPage 组成的,一个page是4096字节大小,每个 AutoreleasePoolPage 以双向链表连接起来形成一个自动释放池。

2.pop 时是传入边界对象,然后对page 中的对象发送release 的消息。

参考地址:

https://www.jianshu.com/p/cc3ee2909457

https://www.jianshu.com/p/1b66c4d47cd7

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,824评论 1 32
  • 一、AutoreleasePool是什么 AutoreleasePool(自动释放池)是OC中的一种内存自动回收机...
    Helly1024阅读 22,139评论 15 87
  • 1、[NSObject alloc]在创建完对象后,会让该对象的retainCount+1,后续的init为初始化...
    naiyi阅读 5,451评论 0 4
  • AutoreleasePool(自动释放池)是OC中的一种内存自动回收机制,它可以延迟加入AutoreleaseP...
    jackyshan阅读 13,537评论 5 33
  • 懒起画娥眉, 镜中愁雾浓。 都缘心忡忡, 化作远山长。 昨晚又飞雪, 寒意飘满院。 双亲出远门, 不知何时归?
    彦文君阅读 3,196评论 10 5