概述
App 启动后,系统在主线程 RunLoop 中注册了两个 Observer:
- 第一个 Observer 监视的事件是 Entry(即将进入 Loop),其回调内调用
_objc_autoreleasePoolPush()
创建自动释放池,优先级最高,保证创建自动释放池发生在其他所有回调之前 - 第二个 Observer 监视了两个事件:
- BeforeWaiting(RunLoop 准备进入休眠)调用
_objc_autoreleasePoolPop()
和_objc_autoreleasePoolPush()
,用来释放旧的池,然后创建新的池。 - Exit(即将退出 RunLoop)调用
_objc_autoreleasePoolPop()
,释放自动释放池。这个 Observer 的优先级最低,保证其释放池子的动作发生在其他所有回调之后
- BeforeWaiting(RunLoop 准备进入休眠)调用
在线程中执行的代码,通常是写在各种事件回调或者 Timer 回调内的,这些回调会被 RunLoop 创建好的 AutoreleasePool 环绕着,所以不会发生内存泄漏。开发者也不必显式创建自动释放池了。
未完待续
网友评论