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
相关产品推荐
相关产品推荐

