2011-11-04 70 views
0
@implementation TestClass 

- (id) init 
{ 
    string = [[NSString alloc] init]; 
    return self; 
} 

- (void) release 
{ 
    [string release]; 
} 

@end 



@implementation MainScreen 

- (void) addItems 
{ 
    [myMutableArray addObject:[[[TestClass alloc] init] autorelease]]; 
} 

- (void) release 
{ 
    [myMutableArray release]; 
} 

我的問題是當我們釋放myMutableArray時,它會調用TestClass的release方法嗎?當包含這些對象的NSMutableArray被釋放時,如何釋放組合對象?

回答

4

不,這不是可可內存管理的工作原理。將對象添加到數組時,數組通過發送-retain消息表示它擁有對象。數組保留這個所有權,直到它本身消失(即被解除分配),然後它不再需要該對象並且發送它以放棄所有權。數組在每次保留或釋放時不需要保留或釋放對象。

總結:對象在需要獲取所有權時保留其他對象,並在不再需要所有權時釋放它們。

這指向您的內存管理string伊娃是不正確的。您在-init(我在非常寬鬆的意義上使用「正確」)中正確佔有零長度字符串的所有權,但每次釋放對象時它都會釋放該字符串。考慮:

TestClass *obj = [[TestClass alloc] init]; 
[obj retain]; 
[obj release]; 
[obj release]; 

上面很可能會崩潰(如果它不,你很倒黴)。當你的對象終於不再需要時,你應該釋放字符串-dealloc。如果您更改伊娃提及的對象,您也必須更改所有權。

+0

嗨Thankz指出特殊情況。我從來沒想過這點。但我的疑問是,當我們將TestClass對象添加到它的類型變爲id的數組中時,我相信。所以當我們釋放數組時,NSObject的釋放方法被調用從而泄漏字符串,或者它會調用TestClass的釋放方法。 – Aaron

+1

首先:這不是特例,它實際上是你在你的問題中記錄的情況。它不會奇蹟般地改變類型。面向對象編程的重點是對象指定自己的行爲,所以如果你發送一個消息的對象,你會得到該對象的行爲,沒有其他。 – 2011-11-04 10:28:08

+0

對不起,我對脆弱的Base類問題感到困惑。 Thatz y我問.. – Aaron

3

千萬不要覆寫-release!你想重寫的是-dealloc!並在那裏你必須調用[super dealloc]

請仔細閱讀http://developer.apple.com/library/mac/documentation/cocoa/conceptual/memorymgmt/MemoryMgmt.pdf

和你的問題,如果你的數組被釋放,該陣列中的每個對象發送一個release消息。

+1

「如果您釋放數組,數組中的每個對象都會發送釋放消息。」 - 這不一定是真的。看到我對Tudorizer的回答的評論。 –

+0

Thx,更新它。 – V1ru8

2

你應該覆蓋 - (void)dealloc方法,而不是 - (void)release one;並在最後總是調用[super dealloc]。 是的,釋放NSMutableArray也會釋放單個對象。

+2

「是的,釋放NSMutableArray也會釋放單個對象。」是不正確的。釋放數組將釋放單個對象。如果沒有其他對象保留它,拋出數組只會導致釋放。 –

+0

你說得對。我的錯。我的意思是_deallocating_。 – Tudorizer

1

就像

[myMutableArray addObject:[[[TestClass alloc] init] autorelease]]; 

將增加retainCount到的TestClass實例

所以會釋放遞減的所有對象的retainCount數組中

注意dealloc是在實施方法你自定義類,它會在您的對象被釋放時調用。

+0

不真實。請參閱對所有其他已做出相同聲明的答案的評論。 – 2011-11-04 09:57:21