2011-10-19 16 views
0
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

myClass *obj = [[myClass alloc] init]; 

NSArray *ar = [NSArray array]; 

[ar addObject: obj]; 

[ar removeObject: obj]; 

[pool drain]; 

從NSArray陣列中移除一個對象是否會自動釋放它先前分配的內存?答案似乎是從我從各種渠道找到的答案。問題是如果我測試內存泄漏,xcode仍然抱怨obj沒有被釋放。那麼究竟發生了什麼?從NSArray中移除對象是否會自動釋放其內存?

回答

2

是的。當你將一個對象插入到一個數組中時,該數組將保留它(碰撞它的保留計數)。如果對象的保留計數爲1(即,其上沒有其他保留),那麼當它從數組中移除時,保留計數將變爲零,並且它有資格被刪除。

但是,您在上述情況下的問題是,將對象添加到數組後,您無法釋放對對象的保留(由於alloc/init)。在[ar addObject:obj]之後插入[obj release]

(另請注意,在你的例子,當你耗盡你的自動釋放池,整個陣列會「噗」。)

+0

謝謝你們,你們的幫助非常感謝。 =) – hollow7

+1

「將從NSArray數組中移除一個對象會自動釋放它之前分配的內存??」 - 嚴格的答案是否定的。它不會釋放你分配的內存,只是釋放數組本身發送的保留。 –

+0

請注意,您的「也注意」可能會引起誤解:當游泳池消失時,陣列將收到「釋放」,但其中的對象將繼續存在,因爲它們也由其他東西所擁有。 –

2

否,則ALLOC它 - >保留的1

計數將其添加到該發送目標的矩陣的另一保留 - > 2

您從數組中刪除該對象和陣列發送發佈 - > 1

...所以現在保留計數回到1,這是你的初始alloc保留,所以你需要釋放它來釋放內存。

3

收藏保留的對象添加到他們,自稱臨時所有權。從集合中刪除項目時,它釋放對象(及其臨時聲明)。換句話說,在將對象添加到集合中並將其刪除之後,保留計數將保持不變。

如果保留計數爲0,則回收存儲器。

在你的代碼中,你正在分配一個對象並聲明它的所有權。這意味着它有一個保留計數1.

然後你將它添加到數組中。該陣列保留該對象,獲取臨時所有權並將其保留計數設置爲2.

然後,您從陣列中移除該對象。該陣列釋放對象,並放棄所有權的任何要求,使保持數回落到1

由於內存不回收,直到保留計數回0(沒有人有對象上的要求),你的對象的內存不被收回。

如果您在將對象添加到數組之前已經對對象進行了自動釋放,或者在刪除對象之後調用對象的釋放(但不是同時!),則保留計數將爲0,並且內存將被回收。

相關問題