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
网友评论