AutoreleasePool?

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?)