2010-05-16 46 views
0

而且又是我數組的數組的數組....正確的方法來清除/釋放陣列

當我有一個包含一個數組的「Y」的多個實例的數組「×」,如何清除/釋放它沒有冒內存泄漏的風險?

下面的調用是否足夠?

(a)中清除陣列

[x removeAllObjects]; 

(b)中釋放所述陣列

[x release]; 

或我需要枚舉陣列,諸如:

(c)中結算陣列

for(int i=0;i<x.count;i++) 
    [[x objectAtIndex:i] release]; 
    [x removeAllObjects]; 

(d)釋放所述陣列

for(int i=0;i<x.count;i++) 
    [[x objectAtIndex:i] release]; 
    [x release]; 

由於事先

回答

6

(b)應是足夠的。數組的釋放器將釋放所有包含的對象,併爲每個保留釋放一個釋放(所以多次釋放的次數會隨着它們的添加次數而釋放)。

從不做[[x objectAtIndex:i] release] - 您沒有保留返回的對象,因此您將通過釋放它來清除其保留計數。

+1

iFioh:(a)和(b)是有效的; (c)和(d)不是(它們過度釋放數組中的對象,這會導致崩潰)。如果您想保留該數組以便將對象放入其中,請使用(a)。如果你想完全拋棄數組(如'dealloc'),使用(b)。 – 2010-05-16 22:56:31

-1

確保沒有內存泄漏的最佳方法是將該對象添加到數組後,應該釋放它,以便對象的保留計數爲1,並且只有數組保留它。因此,當你釋放數組時,它將釋放消息給數組中的所有對象,並且所有對象的retainCount將變爲0,並且它們將是dealloc

+2

將對象添加到陣列後,保留計數可能爲1,也可能不爲1。添加到陣列後,您可能會也可能不需要釋放它。最後,刪除數組後,對象可能會或可能不會被釋放。永遠不要將保留計數看作是絕對值,只會改變。在任何給定時間對象的保留計數都是一個經常無法控制的實現細節。 – bbum 2010-05-16 16:06:37

+0

也許你誤解了它,但我沒有說它從數組中移除時,它將被釋放。我的意思是說,如果你把它移出來並且得到retainCount 0,它將會是dealloc(不是立即,但是在某個時候,也取決於系統)。無論如何,我認爲這應該只是一個好習慣,並且提醒人們,當他們將一個對象添加到數組中時,retainCount將會增加,因此如果他們想確保只有數組擁有該對象,他們應該釋放該對象 – vodkhang 2010-05-16 16:16:21

+1

@vadkhang:關鍵在於,如果你甚至想用retainCount來思考,你就錯了。你應該只考慮所有權。例如,在上面的d中,如果您問「我是否擁有從objectAtIndex獲得的引用:?答案是」否「,因此很明顯,循環內部的版本不正確。 – JeremyP 2010-05-16 17:41:21