美文网首页
AutoreleasePool的原理记录

AutoreleasePool的原理记录

作者: kobe55 | 来源:发表于2019-08-26 01:57 被阅读0次

    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

    相关文章

      网友评论

          本文标题:AutoreleasePool的原理记录

          本文链接:https://www.haomeiwen.com/subject/mbelectx.html