为何重写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
相关产品推荐
相关产品推荐

