2014-09-02 75 views
11

我正在Swift中構建一個iOS應用程序,並在Apple提供的Lister示例項目上繪圖。在Swift的NSObject子類的初始化程序中調用super.init()

Lister使用兩個模型對象:List和ListItem。我發現他們都不會在初始化器中調用super.init(),即使它們是NSObject的子類。

但是,在Lister的Objective-C版本中,兩個模型對象(AAPLList和AAPLListItem)都會調用[super init]

雨燕編程語言明確規定,「指定的初始化程序必須調用從他們的直接超類的指定初始化方法。」(在初始化初始化程序鏈接的規則1)

這是怎麼回事?爲什麼這是一個例外,如果你不應該總是在子類中調用super.init(),什麼規則適用?

回答

12

即使我在文檔中找不到描述這個位置的地方,會發生什麼情況是,在子類初始化程序的末尾調用默認超類初始化程序(如果這是超類的唯一初始化程序)沒有被明確地調用。

NSObject只有初始化器(init());默認你可以看到試圖引用自(如println(self))在不調用super.init():一個構造函數,超初始化器被稱爲在子類初始化器的你到底是不允許做因爲該類沒有在這一點上完全初始化。

如果你想在構造函數中的某處使用自我,對象需要在這一點上完全建立,所以你需要在那之前手動調用super.init()

相關問題