type
status
date
slug
summary
tags
category
icon
password
RunLoop Observer 可以监听以下几种 RunLoop 的状态:
- Entry(即将进入 RunLoop):
- 当 RunLoop 即将进入循环时,触发 Entry 状态。
- 在该状态下,可以执行一些初始化操作或准备工作。
- Before Timers(即将处理定时器):
- 当 RunLoop 即将处理定时器事件前触发 Before Timers 状态。
- 在该状态下,可以处理定时器相关的逻辑。
- Before Sources(即将处理源事件):
- 当 RunLoop 即将处理源事件前触发 Before Sources 状态。
- 在该状态下,可以处理源事件相关的逻辑。
- Before Waiting(即将进入休眠):
- 当 RunLoop 即将进入休眠状态前触发 Before Waiting 状态。
- 在该状态下,可以执行一些清理操作或其他逻辑。
- After Waiting(即将从休眠中唤醒):
- 当 RunLoop 即将从休眠状态唤醒时触发 After Waiting 状态。
- 在该状态下,可以执行一些唤醒后的操作。
- Exit(即将退出 RunLoop):
- 当 RunLoop 即将退出循环时触发 Exit 状态。
- 在该状态下,可以执行一些收尾工作或资源释放操作。
点击屏幕后,手机会使用其他进程响应屏幕的点击,完事转发给Source1,(请看runloop篇),Source1这个时候会使runloop进入Before Sources状态,Before Sources状态会使autoreleasePool进行push操作,push操作会在autoreleasePool创建新的page,保存此次临时变量,比如我创建了一个view,这个view如果没有被引用(引用计数没有增加),那么pop的时候引用计数减一它就没了;如果增加,它就依然存在
哨兵对象就是为了解决这种page的嵌套;当 RunLoop 进入 After Waiting 阶段时,会执行 autorelease pool 的 pop 操作,即将当前的 autorelease pool 销毁,并恢复上一个 autorelease pool 为当前的 autorelease pool。
- RunLoop Observer 的状态:
- 在 RunLoop 的 Before Sources 阶段,Runloop Observer 的状态为 Before Sources。
- 在 RunLoop 的 After Waiting 阶段,Runloop Observer 的状态为 After Waiting。
- autorelease pool 的 push 和 pop:
- 当 RunLoop 进入 Before Sources 阶段时,会执行 autorelease pool 的 push 操作,即创建一个新的 autorelease pool,并将其设置为当前的 autorelease pool。
- 当 RunLoop 进入 After Waiting 阶段时,会执行 autorelease pool 的 pop 操作,即将当前的 autorelease pool 销毁,并恢复上一个 autorelease pool 为当前的 autorelease pool。
当 RunLoop 进入 Before Sources 阶段时,会执行 autorelease pool 的 push 操作,创建一个新的 autorelease pool,并将其设置为当前的 autorelease pool。这个新的 autorelease pool 成为当前的活动 autorelease pool,而之前的 autorelease pool 仍然存在,只是不再是当前的活动 autorelease pool。
在 RunLoop 的 Before Sources 阶段之前,可能已经存在一个全局的 autorelease pool 或者其他上下文中的 autorelease pool。当 RunLoop 进入 Before Sources 阶段时,会创建一个新的 autorelease pool,并将其设置为当前的 autorelease pool,这意味着新创建的临时对象将被添加到这个新的 autorelease pool 中进行管理。
之前的 autorelease pool 仍然存在,只是不再是当前的活动 autorelease pool。它仍然保留在内存中,直到 RunLoop 的 After Waiting 阶段执行 autorelease pool 的 pop 操作将其销毁。
总结起来,在 RunLoop 的不同阶段,可以有多个 autorelease pool 存在,但只有当前的活动 autorelease pool 才会被新创建的临时对象自动添加进去。之前的 autorelease pool 仍然存在,直到合适的时机进行销毁。这样可以在不同的阶段管理临时对象的生命周期,并确保正确的内存管理。
也就是说keyWindow通过RootViewController引用了我的MyController,这个时候autorelease pool page如果对我的MyController进行了pop,但是KeyWindow依然对我的MyController有引用,所以我的MyController不会释放,但是MyController也不存在于autorelease pool page中了
相关文章