You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:37:19