为什么程序在运行时不读取super.viewDidLoad()
,因此不会陷入无限循环?
override func viewDidLoad() {
super.viewDidLoad()
}
答案 0 :(得分:1)
通过在此方法的重写中调用super.viewDidLoad()
,它是在调用此方法的超类实现,而不是再次调用您的实现。因此,没有无限循环。
这种调用super
的做法可确保尽管您可以覆盖所讨论的方法,但仍将确保代码仍将执行超类在其实现中所做的任何操作(如果有的话)。您不想仅仅因为碰巧重写了一些方法而意外丢失/更改了子类中的一些基本视图控制器行为。
这引起了一个问题:“当我重写方法时,我必须调用super
实现吗?”
通常,对于这些生命周期事件,是的,如果一个方法重写了一个方法,则应该调用super
实现,除非该特定方法的文档另有建议。 (我知道,如果这是一条硬性规定,那就太好了,但现实是您应该只逐个引用文档。)
话虽如此,当绝对必要调用super
移交时,这些方法的文档通常会警告我们。例如,viewDidAppear(_:)
的{{3}}是明确的(加了强调):
您可以重写此方法以执行与呈现视图相关的其他任务。如果您重写此方法,则您必须在实现的某个时刻调用
super
。
在极少数情况下,也确实不应该这样称呼它。例如。 the documentation代表loadView
(不要与viewDidLoad
混淆)明确警告我们:
您对此方法的自定义实现应不调用
super
。
作为一般规则,当您重写方法时,您要确保不更改超类的行为(本着the documentation的精神)。并且,除非您因super
方法无能为力(而且永远不会做)的事实知道,否则除非确实有非常具体的原因(例如文档中的明确建议, )。
答案 1 :(得分:0)
super.viewDidLoad()
表示它调用从超类继承的方法viewDidLoad()
。 override
发生在子类中。
override func viewDidLoad() {
// First call the viewDidLoad() from the superclass
super.viewDidLoad()
// Run the rest in the subclass
}