2015-12-01 60 views
1

我已經編寫了好幾年了,而且我非常習慣在重寫它時總是調用方法的超級構造函數。但最近我一直在想,是否總是有必要的......當你重寫一個初始化程序時,你應該調用super.init()。但是在斯威夫特和iOS開發,如果你重寫UIViewController生命週期方法像viewDidLoad(),忘記打電話給super.viewDidLoad()這麼想的產生任何警告或錯誤以及代碼編譯器似乎編譯罰款。所以我想知道這個調用是否以某種方式構建到SDK中,如果甚至有必要(考慮到我們想讓代碼儘可能高效和正確)?需要在Swift中爲生命週期方法調用超級構造函數

回答

2

我想你可以看here一個很好的答案。

蘋果不限制你打電話super.viewDidLoad(),但它不會是安全的它的調用之前使用的一些觀點週期的方法和變量。如果你想首先創建你自己的變量或屬性 - 我想,這不會是一個問題。

+0

很好的答案 - 謝謝! – NikMos

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) 
    } 
+0

我也是(除了重寫方法沒有在其中做任何事情,但我想這只是舉一個例子)...但是我要找的是一些文檔,說明爲什麼你需要它(一般不是,但是對於iOS )。如果你編寫'override func viewDidLoad(){self.doSomething()}'它會編譯並工作得很好......那麼爲什麼要調用'super.viewDidLoad()'?它是多餘的嗎? – NikMos

0

所以,過了一段時間我有第一手的經驗,如果我不總是調用超可能會發生什麼:
比方說,你有兩個viewControllers

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


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

現在你期望當你推到ViewControllerA它會叫doSomethingImportant(),但在大多數情況下不會發生,b因爲您忘記了在ViewControllerA中撥打super.viewDidLoad()

相關問題