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

iOS中Android的onSaveInstanceState等效方法是什么?ViewController生命周期疑问

iOS中Android状态保存方法的等效实现及ViewController实例生命周期解析

嘿,作为同时折腾过Android和iOS开发的老司机,来给你详细捋清楚这两个问题:

一、对应Android onSaveInstanceState/onRestoreInstanceState的iOS实现

Android的这两个方法核心是自动保存/恢复页面状态,iOS没有完全一对一的API,但有官方推荐的替代方案,也可以自定义实现:

1. 官方状态保存与恢复系统

iOS UIKit提供了一套完整的状态保存恢复机制,对应核心内容如下:

  • 让你的ViewController遵循UIViewControllerRestoration协议,并实现static func viewController(withRestorationIdentifierPath: coder:)方法来重建VC实例;
  • 在VC里重写encodeRestorableState(with:)方法,把需要保存的状态(比如输入框文本、开关状态)编码到NSCoder中,这就相当于Android的onSaveInstanceState;
  • 重写decodeRestorableState(with:)方法,从NSCoder中解码恢复状态,对应onRestoreInstanceState;
  • 还要在AppDelegate(或SceneDelegate,iOS 13+)中开启功能:返回application(_:shouldSaveApplicationState:)和application(_:shouldRestoreApplicationState:)为true,场景模式下对应scene(_:shouldSaveApplicationState:)等方法。

这个机制是系统自动触发的,比如应用即将进入后台、内存不足时会自动保存状态;当应用重新启动或从后台恢复时,自动恢复VC的状态。

2. 手动状态保存恢复

如果觉得官方机制太繁琐,也可以自己手动处理:

  • 在viewWillDisappear或didReceiveMemoryWarning中,把状态保存到UserDefaults、本地文件或者Core Data里;
  • 在viewWillAppear或viewDidLoad中读取保存的状态,恢复UI。
    这种方式更灵活,但需要自己搞定状态的存储和读取逻辑。

二、iOS是否始终保留所有ViewController实例?

答案是不会,ViewController实例的存活完全取决于引用关系和系统内存情况:

  • 正常前台场景:如果VC处于导航栈、TabBar栈中,或者被present展示,这些容器会持有VC的强引用,此时VC实例会被保留。但要注意:当VC的view不在屏幕上时,系统可能会在内存紧张时自动释放VC的view(iOS 6+自动处理,无需手动调用viewDidUnload),但VC实例本身只要有强引用就不会被销毁。
  • 后台或内存紧张时:如果应用进入后台后长时间不活跃,或者系统内存不足,系统可能直接终止整个应用,此时所有VC实例都会被销毁。下次启动应用需要重新创建VC并恢复状态(这时候就需要用到上面的状态保存方案)。
  • 手动移除引用:当你把VC从导航栈pop、dismiss,或者手动移除所有对它的强引用时,ARC(自动引用计数)会自动销毁这个VC实例。

举个例子:你push一个DetailVC到导航栈,此时导航栈持有它的强引用,实例不会被释放;当你pop回到ListVC后,如果没有其他地方持有DetailVC的强引用,它就会被ARC销毁。

内容的提问来源于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:50:06