我偶然發現了這個帖子In Objective-C why should I check if self = [super init] is not nil?自我= [超級初始化]再訪
我能理解this syntax:
- (id)initWithString:(NSString *)aString
{
self = [super init];
if (self)
{
instanceString = [aString retain];
}
return self;
}
- (id)init;
{
if (!(self = [super init]))
return nil;
// other stuff
return self;
}
,但我還是不明白「標準」模板語法
- init {
if((self = [super init])) {
// set up instance variables and whatever else here
}
return self;
}
有人可以儘可能清楚地告訴(3)與(1)或(2)相比,或多或少有什麼作用?我讀過的所有內容都很混亂(爲什麼人們不能同意純粹技術的東西看起來像政治:))
不過,當我閱讀作者的文章,並且我可以模糊地理解它,遠遠超出了僅僅是語法糖辯論或品味的問題。例如it is said:
奇怪然後,當殼體3是壓倒性多見,支持1,2和4,但不兼容與殼體3已經成爲standard.Curiously然後初始化,而殼體3是壓倒性更常見,支持1,2和4但與情況3不兼容的初始化器已成爲標準。
因此,如果可能的話,我想從Objective C Gurus得到一個深刻的哲學答案。
至於你關於Cocoa with Love的問題,我相信他在談論罕見的情況,其中'[super init]'返回超類的單例實例,在這種情況下,他不想重寫實例變量目的。就我而言,這更像是一種學術上的好奇心,而不是你需要擔心的任何事情。 – joerick 2012-03-04 11:49:27
謝謝我現在更好地理解3的語法,所以我給你正確的答案,因爲這是我首先提出的問題。儘管如此,他認爲[超級初始化]可以返回4個案例,而語法3只能處理3個案例,而不處理可能相當頻繁的第四個案例。所以這不是品味的問題:這是一個考慮到所有例外的問題,否則你的應用程序不健壯,你不同意嗎? – user310291 2012-03-04 13:21:03
在Cocoa中這是一個非常罕見的情況,你想要繼承這些會導致問題的對象之一。這些示例是類集羣或單例對象。至少,我可以想到沒有理由繼承一個單身人士,而不用另外引用單身人士。至於繼承類集羣,通常在Cocoa中,我們更喜歡[對象組合](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html# // apple_ref/doc/uid/20000154-397934),而不是繼承。 – joerick 2012-03-04 13:35:06