的標準方法來創建的Objective-C的對象是這樣的:Objective-C中的標準對象初始化不會導致內存泄漏嗎?
MyClass* object = [[MyClass alloc] init];
的標準實現MyClass的的的init方法會是這個樣子:
-(id) init
{
self = [super init];
if(self) { /* initialize */ }
return self;
}
除了一些語法變化,並且不包括工廠方法,這似乎是編寫init方法的推薦方式,並且可以使用它。
據我所知,self的目的是[super init];是爲了處理[super init]失敗的情況。但是,如果它失敗了,並返回零,不會有內存泄漏?原因是MyClass的init將返回零,對象將爲零,將不會有更多的指針引用分配給對象[MyClass alloc],因此無法釋放它。
這些是我能想到的兩種解決方案,但我在正規練習中沒有看到任何一種。
到頁頭通話結束後,在調用init之前檢查的結果:
MyClass* object = [MyClass alloc];
if(object == nil) { /*handle the error */ }
else { object = [object init]; }
或者,如果[超級初始化]失敗,釋放內存。類似這樣的:
-(id) init
{
id temp = [super init];
if(!temp) { [self release]; }
self = temp;
if(self) { /* initialize */ }
return self;
}
我在那個推理中錯了嗎?有人可能會認爲[super init]不太可能失敗,但爲什麼將它的結果分配給self並檢查是否爲零?我很樂意看到一些澄清。