2015-11-05 38 views
3

我已經閱讀了objective-c中的指定和便利初始值設定項目,我覺得我對它們的使用方式和原因有了很好的理解。我只有幾個未解決的問題,真的很好。當你創建一個新的指定初始化程序時,你必須覆蓋init嗎?

假設您有一個直接從NSObject繼承的類,並且您爲其創建了一個指定的初始化程序。

我知道你現在可以使用標記NS_DESIGNATED_INITIALIZER但我想知道如果這意味着它迫使您在指定初始化分開,同一個類中,第一個覆蓋INIT與你指定的初始化一個電話?其次,如果你不使用這個宏,那麼可能會有什麼後果不是通過調用指定的初始化器來顯式地重寫init?我意識到編譯器不會知道哪一個是指定的初始化器,所以會有什麼不好的事情發生,而且當你爲你的類創建一個新的指定的初始化器時,它也可以重寫init是一個好習慣嗎?

編輯:我只是想在這個問題上進一步澄清。我已經看到了好的編程人員的例子,儘管他們已經添加了自己製作的指定初始化程序,但沒有添加獨特的方法來覆蓋init。 當我問你是否應該覆蓋初始化我的意思是除了創建您自己的特定指定的初始化程序,當然應該調用其超類的init方法。我看到一個好的編碼器不這樣做,所以我想知道爲什麼你會這樣做。

+0

只需添加註釋。我想爲什麼我提到的編碼器創建了自己指定的初始化器,並且沒有在類中重寫init,因爲他們的自定義指定的初始化器只是通過調用super調用NSObject的init,因此該特定的init沒有執行他們就這麼放了。只是我現在就接受它。 – cheznead

+0

我認爲上述是一個壞主意。我已經諮詢了Matt Neuberg的「iOS 7編程基礎知識」一書,並在第7頁上對其進行了介紹。他說'定義指定初始化程序的類也應該覆蓋繼承的指定初始化程序(在本例中爲init)。你可以看到爲什麼:如果我們不這樣做,有人會說[[Dog alloc] init] ...並創造一個沒有數字的狗 - 我們的初始者試圖阻止的事情「。 – cheznead

回答

3

你現在可以使用NS_DESIGNATED_INITIALIZER標記你指定的初始值設定項,但是我想知道這是否意味着它迫使你在同一個類中單獨地調用指定的初始值設定項嗎?

在self中調用任何初始化程序將繞過警告。當我嘗試調用super.init方法時,我收到以下警告。

方便初始化程序缺少對另一個初始化程序的「自我」調用。

什麼可能的影響是不重寫INIT明確地調用指定的初始化?

這意味着您的對象可能會丟失一些重要的信息,它需要運行,或者應用程序假定對象總是有,如果沒有它,可能會導致錯誤或崩潰應用程序。

這裏是它如何工作的一個很好的解釋:

http://timekl.com/blog/2014/12/09/objective-cs-designated-secret/

相關問題