iOS-AutoReleasePool

120 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

本文同时参与「掘力星计划」,赢取创作大礼包,挑战创作激励金

通过问题看本质!!!

如果被问到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方法释放自动释放池,优先级设置为最低,保证在所有的回调处理之后。

项目中使用
  • 作用:控制应用程序的内存峰值,使其不要太高。
  • 场景:大量创建临时变量时使用自动释放池,及时释放内存。