需要在 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=].
我已经编码多年了,我非常习惯在重写方法时总是调用方法的超级构造函数。但最近我一直在想它是否总是必要的......我知道当你覆盖一个初始化程序时你应该调用 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=].