题目
简述 UIViewController 的生命周期方法及调用时机
信息
- 类型:问答
- 难度:⭐
考点
UIViewController, 生命周期, 方法调用顺序
快速回答
UIViewController 的主要生命周期方法及调用顺序:
viewDidLoad():视图加载完成时调用,适合初始化操作viewWillAppear(_:):视图即将显示时调用viewDidAppear(_:):视图完全显示后调用viewWillDisappear(_:):视图即将消失时调用viewDidDisappear(_:):视图完全消失后调用
注意:loadView() 创建视图层次结构,通常不需要直接重写。
解析
一、生命周期方法及作用
UIViewController 的生命周期管理视图的加载、显示和销毁过程:
- viewDidLoad()
- 调用时机:视图控制器完成视图加载后(仅调用一次)
- 典型用途:初始化界面元素、设置数据源、网络请求等
- 注意:此时视图的 bounds 可能尚未确定
- viewWillAppear(_:)
- 调用时机:视图即将添加到窗口时(每次显示前都会调用)
- 典型用途:更新UI、开始动画、注册通知
- viewDidAppear(_:)
- 调用时机:视图完全显示并完成动画后
- 典型用途:启动耗时操作(如定位)、数据分析埋点
- viewWillDisappear(_:)
- 调用时机:视图即将从窗口移除时
- 典型用途:保存数据、暂停任务、注销通知
- viewDidDisappear(_:)
- 调用时机:视图完全移除后
- 典型用途:清理资源、停止服务
二、代码示例
class MyViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("视图加载完成")
setupUI() // 初始化界面
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("视图即将显示")
updateData() // 刷新数据
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("视图已完全显示")
startAnimation() // 开始动画
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("视图即将消失")
saveUserData() // 保存数据
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
print("视图已完全消失")
stopServices() // 停止后台服务
}
}三、最佳实践
- 在
viewDidLoad中执行一次性初始化操作 - 在
viewWillAppear中更新动态数据(如表格刷新) - 配对使用注册/注销操作(如
viewWillAppear注册通知,viewWillDisappear注销) - 避免在
viewDidAppear中执行阻塞主线程的操作
四、常见错误
- 忘记调用
super方法(如super.viewDidLoad()) - 在
viewDidLoad中依赖视图的最终尺寸(应使用viewDidLayoutSubviews) - 未及时释放资源导致内存泄漏(如在
viewDidDisappear中未停止定时器) - 错误地在
viewWillAppear中执行只该运行一次的操作
五、扩展知识
- 内存警告处理:通过
didReceiveMemoryWarning()释放非必要资源 - 布局回调:
viewWillLayoutSubviews和viewDidLayoutSubviews用于处理布局变化 - 状态恢复:iOS 13+ 使用
sceneWillEnterForeground/sceneDidEnterBackground处理应用状态切换 - 生命周期图示:

(图示说明:创建 → 显示 → 消失 → 销毁的完整流程)