2010-11-03 63 views
6

的標準方法來創建的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並檢查是否爲零?我很樂意看到一些澄清。

回答

6

如果[super init]想要返回零,它也應該自己調用release

2

如果init方法決定中止並返回nil,則該方法應該排除該對象。

但是,這正是if (self)涵蓋的內容。 self = [super init]有其他目的:允許init方法返回消息發送到的對象以外的內容。對於一個真實的例子,[NSArray alloc]返回一個虛擬對象,並且該對象的各種init…方法返回真實數組。