威爾·希普利建議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'變量指向我們的實例(除非明確更改)。
我對不對?當然!
您需要條件... – bbum 2011-05-19 21:26:00
您指的是我忽略了'if((self = [super init])')的必要性嗎?它看起來像海報瞭解條件,但我可以編輯。 – Joe 2011-05-19 21:34:45
是的 - 有人會不經意地複製副本... – bbum 2011-05-19 21:58:17