需要在 Swift 中为生命周期方法调用超级构造函数

Need to call super constructor for lifecycle methods in Swift

我已经编码多年了,我非常习惯在重写方法时总是调用方法的超级构造函数。但最近我一直在想它是否总是必要的......我知道当你覆盖一个初始化程序时你应该调用 super.init()。但是在 Swift 和 iOS 开发中,如果你覆盖 UIViewController 生命周期方法,如 viewDidLoad() 而忘记调用 super.viewDidLoad(),编译器不会产生任何警告或错误,代码似乎编译正常。所以我想知道调用是否以某种方式内置到 SDK 中,甚至是否有必要调用(考虑到我们希望代码尽可能高效和正确)?

我想你可能看起来 here 一个不错的答案。

Apple 不限制您调用 super.viewDidLoad(),但在调用之前使用某些视图循环方法和变量是不安全的。例如,如果您想首先初始化自己的变量或属性 - 我认为这不会有问题。

Yes, you should always call super.

这是我一直在做的事情

// MARK: - Controller life cycle stack
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func viewWillAppear(animated: Bool)
    {
        super.viewWillAppear(animated)
        setupNavigationBar()
    }

    override func viewDidAppear(animated: Bool)
    {
        super.viewDidAppear(animated)
    }

所以,一段时间后,我亲身体验了如果我不总是调用 super 会发生什么:
假设你有两个 viewControllers

class ViewControllerA: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.doSomethingImportant()
    }
}


class ViewControllerB: ViewControllerA {
    override func viewDidLoad() {
         self.doSomethingLessImportant()
    }
}

现在您期望当您推送到 ViewControllerA 时它会调用 doSomethingImportant(),但在大多数情况下不会发生,因为您忘记在 [= 中调用 super.viewDidLoad() 11=].