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

为何重写UIViewController的viewDidLoad时仍需调用super.viewDidLoad?

为什么重写UIViewController的viewDidLoad时仍需调用super.viewDidLoad?

你在Swift中看到的UIViewController的viewDidLoad确实只是一个空的公开方法声明:

open func viewDidLoad()

但这只是Swift层面对外暴露的接口,UIKit的核心实现基于Objective-C,viewDidLoad在底层并非完全没有逻辑。虽然当前版本你看不到具体实现,但苹果随时可能在后续系统版本中为这个方法添加内部处理逻辑——如果现在不调用super.viewDidLoad(),未来系统更新后你的代码很可能出现未知问题。

从面向对象的设计角度出发,还有这些原因:

  • 父类方法可能承担了一些隐藏的初始化工作,比如注册系统观察者、初始化内部状态等,这些细节不会在Swift头文件中公开。
  • 要是你的子类后续继承自某个自定义UIViewController子类,而这个父类的viewDidLoad有实际业务逻辑,调用super.viewDidLoad()才能确保父类代码被执行,不会遗漏关键逻辑。

举个实际场景:假设你写了一个基础父类BaseViewController:

class BaseViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        setupDefaultNavigationBar() // 统一设置导航栏样式
    }
}

当业务页面的ViewController继承自BaseViewController时,只有调用super.viewDidLoad(),才能触发父类里设置导航栏的逻辑,否则这部分样式代码就不会生效。

总的来说,调用super.viewDidLoad()是iOS开发的标准最佳实践——既能兼容未来的系统更新,也能保证继承链中父类的逻辑被正确执行,避免埋下潜在bug。

内容的提问来源于stack exchange,提问作者Omar Ashraf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:27:04