ViewController的deinit方法调用时机探究:应用生命周期场景分析
嘿,我来帮你把这些关于ViewController的deinit调用时机的疑惑理清楚,都是iOS开发里很常见的问题:
关于ViewController的
deinit调用时机的详细解答 1. 应用因内存不足被系统终止时,deinit是否会被调用?
答案是完全不会。当系统因为内存紧张强制终止你的应用进程时,它不会给应用任何执行清理代码的机会——既不会调用deinit,连applicationWillTerminate(_:)这类生命周期方法也不会触发。系统会直接kill掉进程,快速回收内存,不管应用当时处于active、inactive还是background状态,都是这个逻辑。
2. 应用进入后台、挂起状态时,deinit是否会被调用?
正常情况下,进入后台/挂起状态本身不会触发deinit。deinit的执行只和对象的引用计数有关:只有当某个ViewController的所有强引用都被移除,引用计数降到0的时候,它的deinit才会执行。
举个例子:如果你的应用进入后台后,你手动清空了某个ViewController的所有强引用(比如从导航栈pop掉它,同时也没有其他变量持有它),那这个时候它的deinit会被调用,但这是因为引用计数归零导致的,和后台/挂起状态本身没有直接关系。
明确:ViewController的deinit到底何时会被调用?
简单来说,只有当ViewController的所有强引用都被消除,引用计数变为0时,deinit才会被触发,常见的场景包括:
- 执行unwind segue并完成dismissal操作后,ViewController从导航栈/父容器中被移除,且没有其他强引用持有它
- 手动调用
popViewController(animated:)从导航栈中移除该ViewController,且无其他强引用 - 关闭modal展示的ViewController(调用
dismiss(animated:completion:)),且没有其他地方强引用它 - 从自定义容器(比如自定义的Tab容器)中移除ViewController实例,同时清空所有指向它的强引用变量
再次划重点:进入后台或挂起状态本身不会触发deinit,只有在这些状态下恰好发生了该ViewController的引用计数归零的情况,才会执行deinit。
内容的提问来源于stack exchange,提问作者AlanSTACK
相关产品推荐
相关产品推荐

