2012-10-28 40 views
1

我一直在通過網絡搜索和閱讀很多帖子,但沒有人還沒有解釋我如何確切地工作。我知道,約定說,任何方法都必須返回一個自動釋放的對象(除ALLOC,新,複製和mutableCopy),所以這樣的事情是好的:內存管理什麼時候自動發佈返回值

-(MyClass*)findRandomName { return [[[MyClass alloc] initWithString:@"Something"] autorelease]; } 

我的問題是,我應該也叫自動釋放的如果我使用便捷方法或類似的方法返回值?像這裏:

-(MyClass*)findRandomName { return [[MyClass startFromString:@"Something"] autorelease]; } 

爲什麼,或者爲什麼不?先謝謝了。

+0

在第一行代碼中調用'alloc'的位置在哪裏? – rmaddy

+0

啊忘了,修好了。 – ArniDat

回答

2

你的第一個例子是不正確的,它應該調用initWithString之前調用[MyClass alloc],例如:在第二個例子中,你應該autorelease對象

-(MyClass*)findRandomName { 
    return [[[MyClass alloc] initWithString:@"Something"] autorelease]; 
} 

startFromString方法應該已經autorelease對象,如果您autorelease它再次您將釋放該對象。

在第二個例子的findRandomName方法沒有考慮對象的所有權(因爲它調用方法不包含在名稱allocnewcopymutableCopy),因此它不應該release的對象。

您的聲明「該約定表示任何方法必須返回自動釋放對象(init,new和copy除外)」並不完全正確。該memory management policy說:

你擁有的任何對象創建

您創建使用名稱以「黃金」, 「新」,「複製」,或「mutableCopy」對象的方法(例如,alloc,newObject或 mutableCopy)。

+0

我正在尋找(並跳來跳去)的確切答案,謝謝! – ArniDat

+0

如果您認爲這回答了您的問題,請不要忘記接受它。 – mttrb

+0

我確定會,當計時器讓我;) – ArniDat

相關問題