美文网首页
AutoreleasePool?

AutoreleasePool?

作者: 拉布拉熊 | 来源:发表于2018-03-30 11:00 被阅读0次

    1.AutoreleasePool介绍

    AutoreleasePool称为自动释放池,在自动释放池中调用了autorelease的对象会被放在该池的顶部,以栈的形式管理对象。当自动释放池销毁时,自动释放池中的对象会自动调用release来销毁对象,释放资源,以达到自动管理内存的目的。

    2.AutoreleasePool的实现原理

    AutoreleasePool没有单独的内存结构,它通过以AutoreleasePoolPage为结点的双向链表来实现

    AutoreleasePoolPage的结构:

    1.magic 用来校验 AutoreleasePoolPage 的结构是否完整;

    2.next 指向最新添加的 autoreleased 对象的下一个位置,初始化时指向 begin() ;

    3.thread 指向当前线程;

    4.parent 指向父结点,第一个结点的 parent 值为 nil ;

    5.child 指向子结点,最后一个结点的 child 值为 nil ;

    6.depth 代表深度,从 0 开始,往后递增 1;

    7.hiwat 代表 high water mark 。

    3.AutoreleasePool实现步骤

    App启动后,系统会在主线程的Runloop里注册两个observer(监听),这两个observer都回调_wrapRunloopWithAutoreleasePoolHandler函数。

    第一个observer--Entry:即将进入Runloop, 调用_objc_autoreleasePoolPush函数创建自动释放池。其优先级最高,保证创建自动释放池发生在其他所有回调之前。

    第二个observer--BeforeWaiting:准备进入休眠时,调用_objc_autoreleasePoolPop并_objc_autoreleasePush释放旧的池和创建新的池;Exit:即将退出Runloop时,调用_objc_autoreleasePoolPop函数,释放自动释放池。其优先级最低,保证发生在其他所有回调之后。

    4.AutoreleasePool的释放有以下两种情况

    一是在当前Runloop结束时自动释放

    二是手动调用AutoreleasePool的drain方法来销毁AutoreleasePool

    总结

    通常情况下,我们不需要手动创建AutoreleasePool,只需要使用线程自动维护就好。但下面三种情况需要我们手动添加AutoreleasePool

    1.编写的程序不是基于UI框架的,比如命令行程序

    2.使用循环创建了大量的临时变量

    3.创建了辅助线程

    参考链接:

    1.https://blog.csdn.net/nathan1987_/article/details/78402332

    2.http://www.cocoachina.com/ios/20150610/12093.html

    相关文章

      网友评论

          本文标题:AutoreleasePool?

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