侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

简述 UIViewController 的生命周期方法及调用时机

2025-12-11 / 0 评论 / 4 阅读

题目

简述 UIViewController 的生命周期方法及调用时机

信息

  • 类型:问答
  • 难度:⭐

考点

UIViewController, 生命周期, 方法调用顺序

快速回答

UIViewController 的主要生命周期方法及调用顺序:

  1. viewDidLoad():视图加载完成时调用,适合初始化操作
  2. viewWillAppear(_:):视图即将显示时调用
  3. viewDidAppear(_:):视图完全显示后调用
  4. viewWillDisappear(_:):视图即将消失时调用
  5. viewDidDisappear(_:):视图完全消失后调用

注意:loadView() 创建视图层次结构,通常不需要直接重写。

解析

一、生命周期方法及作用

UIViewController 的生命周期管理视图的加载、显示和销毁过程:

  1. viewDidLoad()
    • 调用时机:视图控制器完成视图加载后(仅调用一次)
    • 典型用途:初始化界面元素、设置数据源、网络请求等
    • 注意:此时视图的 bounds 可能尚未确定
  2. viewWillAppear(_:)
    • 调用时机:视图即将添加到窗口时(每次显示前都会调用)
    • 典型用途:更新UI、开始动画、注册通知
  3. viewDidAppear(_:)
    • 调用时机:视图完全显示并完成动画后
    • 典型用途:启动耗时操作(如定位)、数据分析埋点
  4. viewWillDisappear(_:)
    • 调用时机:视图即将从窗口移除时
    • 典型用途:保存数据、暂停任务、注销通知
  5. 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() 释放非必要资源
  • 布局回调viewWillLayoutSubviewsviewDidLayoutSubviews 用于处理布局变化
  • 状态恢复:iOS 13+ 使用 sceneWillEnterForeground/sceneDidEnterBackground 处理应用状态切换
  • 生命周期图示
    生命周期流程图
    (图示说明:创建 → 显示 → 消失 → 销毁的完整流程)