为什么通过添加super.viewdidload()程序不会陷入无限循环?

时间:2019-08-22 19:38:45

标签: ios swift oop

为什么程序在运行时不读取super.viewDidLoad(),因此不会陷入无限循环?

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

2 个答案:

答案 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
}