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

时间:2015-12-01 08:01:17

标签: ios swift initialization

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

3 个答案:

答案 0 :(得分:2)

我认为你可能会看到here一个很好的答案。

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

答案 1 :(得分:0)

  

是的,你应该总是打电话给超级。

这是我做的alwyas

// 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)
    }

答案 2 :(得分:0)

所以,经过一段时间我亲身经历了如果我不总是打电话给超级可能会发生什么:
我们假设您有两个viewControllers

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


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

现在,您希望当您推送到ViewControllerA时,它会调用doSomethingImportant(),但在大多数情况下,这不会发生,因为您忘记在{{super.viewDidLoad()拨打电话1}}。