2010-02-12 64 views
3

我有三個簡單的問題,我看到了相互衝突的答案,希望有人可以清理。三個Objective-C構造函數問題

  • [super init]是否需要一直到NSObject? (例如,如果Foo繼承自NSObject,Foo應該調用[super init]嗎?如果不是,那麼它是否也適用於dealloc?
  • 是否有任何形式的默認初始化會發生在對象中的成員變量。例如,NSString *成員被初始化爲nil?漂浮到0.0?
  • 如果我的對象具有一個initFoo方法,我可以調用[自INIT]該函數內執行常見的初始化?

由於與目標C我已經開始幾乎假設是的第一個和沒有爲第二個,但我希望保存一些打字:)

謝謝,

回答

6

只是爲了增加一點三個回覆我前面:

  1. 是它。在實踐中NSObject(可能)不需要它(現在),但如果改變了,如果你沒有改變,你就會被搞砸。無論如何,最好還是養成習慣(或者使用XCode中的代碼來放下init模板)。這表示並不總是您應該致電init(更快)。

  2. 正如已經注意到的初始化默認值(憑藉memcpy 0s,所以0,零等)是有保證的,並且依賴於這個是合理的習慣。有些人仍然喜歡明確,這很好。

  3. 絕對如此。記住初始化,或任何變化只是一個正常的方法。這只是一個初始化者按照慣例(儘管是一個非常強大的慣例)。您可以自由調用其他方法,包括其他初始者。同樣,按照慣例,你應該決定一個「designated initializer」,並讓所有其他初始化者稱這個。考慮一下你的第一個問題。如果你繼承,你的子類會調用什麼?默認情況下,一個子類作者會調用你的init--所以如果你有一個不同的指定初始化器,那麼你明確的做出這樣的決定非常重要,以便子類作者知道它叫它。

您可以閱讀更多(權威)詳細信息here in the Apple docs

0
  1. 是爲init(不是技術上必需的,但最好的做法)肯定是有的爲dealloc
  2. 是的,所有的記憶被初始化爲0這是nil0.0
  3. 是的,這是常見的
2

您總是需要調用超類的初始化方法並將self賦值給結果。在執行-dealloc結束時,您還一定需要致電super的實施。

默認情況下,所有實例變量初始化爲零/零,這是有保證的。

是的,你甚至可以從一個更具體的初始化方法[self init]

- (id)initFoo 
{ 
    self=[self init]; 
    if(self) 
    { 
     //do stuff 
    } 
    return self; 
} 
0
  • 是的,否則超類對象不會有機會做自己的初始化。

  • 不知道。

  • 是的。創建你想要的任何init方法。記錄它。但一定要調用super的正確init方法:不管它是什麼。