2012-08-13 36 views
3

在Cocoa中,建議始終調用超類的指定初始值設定項。假設在對象初始化期間始終調用init,即使對象未使用init初始化,是否安全?是否始終調用NSObject init?

例如,如果我們假設有一個類:NSThingie,它可以初始化爲[[NSThingie alloc] initWithFoo: foo][[NSThingie alloc] initWithFoo: foo andBar: bar]。如果我覆蓋初始化,我可以假定它會在初始化過程中的某個時刻被調用嗎?


編輯

也許我原來的問題沒有措辭這麼好。我知道覆蓋init會導致超類中的init不被調用,我必須明確地調用init。我想知道的是,在蘋果框架中,是否總是調用[NSObject init]。如果我初始化一些Apple對象,如[[NSAppleClass alloc] initWithSomething: something],我是否可以假定在NSAppleClass的初始化過程中最終會調用NSObject的init?

+0

見http://developer.apple.com/library/ios/#documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html有用的信息 – jrturton 2012-08-13 13:49:07

回答

1

如果我覆蓋初始化,我可以假設它會在初始化過程中的某個點 被調用嗎?

如果您覆蓋並調用init方法負責調用指定的初始化程序。開發人員有責任調用子類的正確初始化方法。你稱之爲指定的初始化器的原因是爲了確保這個類被構造成它的預期狀態。不調用正確的初始化程序或根本不調用初始化程序可能會導致未定義/不受歡迎的行爲。

+0

任何特定爲什麼這個答案被拒絕投票而不是其他人? – Joe 2012-08-13 13:53:05

0

是「init」的默認構造函數不會執行精確處理
因爲NSObject類中定義的init方法沒有初始化;它只是返回自我。

4

簡短的回答:沒有

,你需要確保你將覆蓋你正在使用

例如UIView類正確init方法有一個init方法initWithFrame:和一個非常基本實現的那會是:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super init]; //calls init because UIResponder has no custom init methods 
    if (self){ 
     self.frame = frame; 
    } 
    return self; 
} 

init被稱爲超類,但不能在UIView,所以如果你要OVERR IDE init而不是initWithFrame:你的初始化代碼永遠不會被運行

相關問題