2011-05-19 263 views

回答

1

有必要確保正確初始化來自超類MyObject的繼承實例變量。

2

由於Objective-C是面向對象的,因此您可以繼承其他類。當你從其他類繼承時,你可以攔截消息並決定是否將它們傳遞給你繼承的類。在初始化的情況下,它幾乎是總是重要的是要做self = [super init]或使用該類的指定init方法來確保正確創建對象。想象一下,如果在你的init方法的MyObject中創建了你的類使用的NSMutableArray,但是init從未被調用,因爲其他人從你的類繼承而來,並且從來沒有調用[super init]。然後,您將在每個您嘗試使用NSMutableArray的地方都有無參考文件或不正確的指針。設置self等於[super init]的原因是自我可能改變的值,例如在錯誤恢復中。

//this is valid 
-(id)init 
{ 
    if((self = [super init])) 
    { 
     if(someInitializationFails) 
     { 
      [self release]; 
      self = nil; 
     } 
    } 
    return self; 
} 
+0

您需要條件... – bbum 2011-05-19 21:26:00

+0

您指的是我忽略了'if((self = [super init])')的必要性嗎?它看起來像海報瞭解條件,但我可以編輯。 – Joe 2011-05-19 21:34:45

+1

是的 - 有人會不經意地複製副本... – bbum 2011-05-19 21:58:17

1

威爾·希普利建議this(2009年):

- (id)init; 
{ 
if (!(self = [super init])) 
    return nil; 

// other stuff 
return self; 
} 

但爲什麼分配超級init的迴歸自我?

馬特·加拉格爾的article試圖解釋它...

- 報價:

如果你還記得在一開始,我 說,initWithString:中 一個典型的[部分MyClass的頁頭] initWithString:@ 「someString」] 調用轉換成一個 objc_msgSend呼叫:

MyClass *myObject2 = objc_msgSend(myObject1, initSelector, @"someString"); 

因此,當我們得到 到方法的內部,自我 已經有一個值;其值爲 myObject1(即,從[MyClass alloc] 調用返回的分配對象 。因爲 沒有它,超級調用 是不可能的,這是必不可少的 - 自我價值 使用編譯器來發送 調用:

[super init]; 

變爲:

objc_msgSendSuper(self, @selector(init)); 

是的,self已有 在初始化程序 開始時有一個值。實際上,它幾乎是 保證是正確的,最終 的值。

- 引文結束

從本質上講,我想很多人都感到困惑,以什麼每個init方法的「自我」是指向準確,向上通過超鏈。

回答這個謎語是隱含在蘋果的Objective-C Programming Language doc,下標題爲指定初始化:

注意,初始化的B版發送 消息自行調用 initWithName:方法。因此,當接收者是B 類的實例時,它調用B版本 initWithName :,並且當接收者 是C類的實例時,它調用C版本。

或換句話說,'self'變量指向正在初始化的實例。再次強調,通過超類鏈的所有這些init方法都由我們的實例繼承,因此,它們中的'self'變量指向我們的實例(除非明確更改)。

我對不對?當然!