我已經閱讀了objective-c
中的指定和便利初始值設定項目,我覺得我對它們的使用方式和原因有了很好的理解。我只有幾個未解決的問題,真的很好。當你創建一個新的指定初始化程序時,你必須覆蓋init嗎?
假設您有一個直接從NSObject
繼承的類,並且您爲其創建了一個指定的初始化程序。
我知道你現在可以使用標記NS_DESIGNATED_INITIALIZER但我想知道如果這意味着它迫使您在指定初始化分開,同一個類中,第一個覆蓋INIT與你指定的初始化一個電話?其次,如果你不使用這個宏,那麼可能會有什麼後果不是通過調用指定的初始化器來顯式地重寫init?我意識到編譯器不會知道哪一個是指定的初始化器,所以會有什麼不好的事情發生,而且當你爲你的類創建一個新的指定的初始化器時,它也可以重寫init是一個好習慣嗎?
編輯:我只是想在這個問題上進一步澄清。我已經看到了好的編程人員的例子,儘管他們已經添加了自己製作的指定初始化程序,但沒有添加獨特的方法來覆蓋init。 當我問你是否應該覆蓋初始化我的意思是除了創建您自己的特定指定的初始化程序,當然應該調用其超類的init方法。我看到一個好的編碼器不這樣做,所以我想知道爲什麼你會這樣做。
只需添加註釋。我想爲什麼我提到的編碼器創建了自己指定的初始化器,並且沒有在類中重寫init,因爲他們的自定義指定的初始化器只是通過調用super調用NSObject的init,因此該特定的init沒有執行他們就這麼放了。只是我現在就接受它。 – cheznead
我認爲上述是一個壞主意。我已經諮詢了Matt Neuberg的「iOS 7編程基礎知識」一書,並在第7頁上對其進行了介紹。他說'定義指定初始化程序的類也應該覆蓋繼承的指定初始化程序(在本例中爲init)。你可以看到爲什麼:如果我們不這樣做,有人會說[[Dog alloc] init] ...並創造一個沒有數字的狗 - 我們的初始者試圖阻止的事情「。 – cheznead