小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
本文同时参与「掘力星计划」,赢取创作大礼包,挑战创作激励金
通过问题看本质!!!
如果被问到AutoReleasePool,你会怎么回答呢?
网络很多文章讲的都很详细,但是我们不可能面面俱全的说出来。不说背下来,就是让你照着说,你也要说不长的时间了。所以我们要有自己的总结,而且讲得要有思路有条理。因此我们可以从以下几点去说。
1、自动释放池-AutoReleasePool到底是什么?我们只有了解了之后,才会去使用它。如果你都不了解,谈何使用呢。
2、系统是怎么使用的,或者一些框架中是如何使用的。
3、为什么要用自动释放池-AutoReleasePool,它的好处是什么。我们在项目中什么场景会用到。跟着系统/框架学,照猫画虎总该会了吧。
总结起来三点
- 它是什么?如何创建、销毁?和线程的关系...
- 系统是如何用它的?
- 在项目中是如何用的?
概念
- 自动释放池本质是一个autoreleasePoolPage结构体对象,是一个栈结构(先进后出)存储的页。
- 每一个autoreleasePoolPage都是以双向链表的形式连接起来的。
- 每个自动释放池的压栈和出栈主要通过调用push和pop方法
- 每次push操作其实是创建一个自动释放池,并压入一个哨兵对象,用来做边界判断和越界处理的
- pop操作是释放自动释放池的对象,从后往前调用对象的release方法,直到遇到哨兵对象。
- 子线程停止时,会自动销毁与之关联的自动释放池
系统使用
1、APP启动后,苹果在主线程注册了2个oberserve,
2、第一个时监听事件是即将进入runloop,内部会创建自动释放池,优先级设置为最高,保证在所有的回调处理之前。
3、第二个oberserve是监听2个事件,
1个事件是runloop即将进入休眠之前,会释放旧的池子,创建新的池子。
1个事件是runloop即将推出时,会调用pop方法释放自动释放池,优先级设置为最低,保证在所有的回调处理之后。
项目中使用
- 作用:控制应用程序的内存峰值,使其不要太高。
- 场景:大量创建临时变量时使用自动释放池,及时释放内存。