2011-01-23 46 views
0

我很新奇Objective-C,我想了解一些關於這個保留髮布機制的東西。iphone - 一個關於保留數組的問題

假設我需要一個數組來維持應用程序的整個生命週期。所以,假設我使用類似

myArray = [[NSMutableArray alloc] init]; 

在應用程序的開始創建陣列。

在應用程序中,此數組可能會刪除所有對象,從其他數組中添加對象等。假設在添加對象的這些操作之一中,我會將自動釋放對象添加到數組中。兩個問題:

  1. 將被添加到該數組的對象總是活的,並且在數組分配時從不釋放數據?

  2. 我知道將一個對象添加到數組將增加其保留數。這對自動釋放對象也有效嗎? (也許是自動釋放陣列其他方法來)

感謝

回答

0

添加到該數組的對象是否會一直處於活動狀態,並且在分配數組時是不會釋放的?

他們會在正常情況下,即提供您不會讓他們過度放熱。例如,

// take ownership (alloc) followed by relinquish ownership (autorelease) 
// the net result is that this code snippet DOES NOT own someObject 
SomeClass *someObject = [[[SomeClass alloc] init] autorelease]; 

// myArray takes ownership of someObject 
[myArray addObject:someObject]; 

// someObject is INCORRECTLY (over)released 
[someObject release]; 

考慮,沒有其他的代碼已經奪去了someObject所有權,也不會是「活」,因爲overreleased。

我知道將一個對象添加到數組將增加其保留數。這對自動釋放對象也有效嗎? (可能是來自其他方法的自動釋放陣列)

是的。集合不會在添加對象時查看保留計數或自動釋放狀態,也不應該這樣做。一個數組只需將-retain發送給正在添加的對象,並因此獲取該對象的所有權,而不管擁有(或不擁有)對象的其他代碼。

內存管理和對象所有權的關鍵在於以相對的方式考慮所有權:如果集合需要一個對象,它將獲得對象的所有權;如果集合被釋放或者該對象從集合中被移除,它將放棄該對象的所有權。該集合不關心其他對象或代碼擁有的對象 - 它只關心擁有該對象的自己的視角。同樣的原則應該適用於你的代碼。

1

回答你的第一個問題是 - 被定義的任何集合對象將保持其收集的對象住,直到自己被釋放的集合。

至於你的第二個問題,發送autorelease消息的對象將擁有所有權轉移到當前的自動釋放池,直到該對象被另一個範圍所擁有,此時該對象從池中被刪除。

例如:

[[[NSArray alloc] init] autorelease]; 

內存泄漏(和你沒有自己的對象)假設有一個可用的自動釋放池。

0

基本是對象釋放時,保留計數達到0

所以現在回答你的問題:在數組中的對象有它的對象的所有權。所以直到數組被釋放,數組集合中的對象將被保留。

關於autorelease對象--- autorelease只談現在的所有權,所以當你添加一個自動釋放對象到數組集合然後數組增加保留數1並擁有所有權。自動釋放將在其週期中將保留計數減少1。 (仍然有另外1個保留計數來釋放對象)

注意:自動釋放 - 將對象添加到自動釋放池將使保留計數在其排空週期中遞減 - 只有在保留計數時纔會釋放對象是0(那裏沒有所有者)。

+0

您不應該計算保留計數。就這樣。 – 2011-01-23 14:30:04

+0

@Jacob Relkin我不打算計算保留計數值 - 我只是試圖給他更好的圖片如何工作。我看到很多人認爲,如果您添加一個對象到Autorelease池對象是由Autorelease池釋放的。 – 2011-01-23 14:55:32

0

我更喜歡在最後發佈它,而不是自動發佈。控制何時釋放它似乎是一個更好的選擇。當dealloc只是:[myArray removeAllObjects]和[myArray release]後面的函數結尾。

0

如您所知,客觀的c對象是引用計數。任何客觀的c對象將被釋放,當且僅當其引用計數達到零時,沒有例外。

當一個對象被添加到NSMutableArray時,該數組將保留該對象。這意味着,只要你沒有在其他地方保留/釋放對象,添加到該數組的對象將保持活動狀態,直到(1)從該數組中移除該對象,並且(2)該數組本身被釋放,將釋放存儲在其中的每個對象。

將「autorelease」發送給對象將其添加到封閉的自動釋放池中。這意味着當自動釋放池被排空/釋放時,該對象將被髮送釋放消息。對象是否被釋放取決於其他代碼是否保留了它。