2010-06-21 33 views
0

我有一個已保留的可變數組。iphone - 將保留屬性傳播一個數組?

該數組包含帶有許多鍵的字典。每個字典都包含對象。

我必須在將字典添加到可變數組之前保留字典,否則數組本身會保留添加到它的所有內容(因爲它已保留),包括其對象在分層結構中的子對象?

謝謝。

回答

3

基礎容器,例如NSArrayNSDictionary,保留它直接擁有的對象,但不包含對象擁有的子對象。

例如,如果NSArray*a包含NSArray*b而且又包含NSArray*ca保留bb保留ca不保留c

這就是說,你正在從錯誤的角度思考。它是不正確爲你想知道如「我必須保留這個對象(說x),然後通過x到另一個對象y,因爲y可能不會適當地保留它? retain/release這一點是爲了確保對象保留並釋放它擁有的對象。您相信其他對象也會這樣做。

然後,你必須確保,如果你把一個對象x到數組y,是你不釋放x(如果它沒有自動釋放)一旦成爲不需要你。如果y需要它,y保留它,所以你不必關心它。

假設您有預先存在的NSMutableArray*array。然後你會採用如下方法:

NSMutableDictionary* dictionary=[[NSMutableDictionary alloc] init]; 
... do something with dictionary ... 
[array addObject:dictionary]; 
[dictionary release]; 

你看,如果數組需要它,數組的職責就是保留字典。它需要它,所以它保留下來。你不必關心這一點。

該方法的責任是在方法需要時保留字典,如果該方法不再需要它,則釋放它。因此,如上所示,該方法通過將其添加到數組後將其釋放。

再說一句:retain/release的全部意義在於讓您能夠在代碼中非常本地地考慮對象的生命週期。

當你通過傳遞對象b調用另一個對象a的方法method:,你不必擔心,因爲你現在要做的method:是否保留b或沒有,你沒有,如果你需要擔心在通過bmethod:之前保留b

這是因爲Cocoa框架中的每個方法以及您編寫的每個方法都保留傳遞給它的對象b,如果方法稍後需要它,並且如果稍後不需要保留b

+0

我的意思是:我有一個可變數組,它在應用程序啓動時會被聲明,並且會被幾種方法使用。一種「全局」數組。有些方法會創建字典,這些字典將被添加到該數組中。這些字典包含對象。在正常情況下,在該方法結束時,如果我不保留它,但這個字典會丟失或泄漏,但是當我將它添加到一個保留的可變數組時,我不知道在添加之前是否必須保留字典。 .. – SpaceDog 2010-06-21 19:51:01

+0

增加了更多的單詞...... – Yuji 2010-06-21 22:48:44

+0

thanksssssssssssssss !!!!!!!!!!! – SpaceDog 2010-06-24 03:45:33

1

Objective-C容器(如NSMutableArray)將保留添加到它們的對象。

然而,這與任何被「傳播」的東西沒有任何關係 - 無論你是否在NSMutableArray上調用-retain都不相關。 NSMutableArray將簡單地保留添加到它的對象,並且如果這些對象本身是某種容器(例如字典),則子對象本身已經保留添加到它們的任何東西,等等。

ps。沒有真正的「保留屬性」,每個對象都有一個(內部)「保留計數」。例如,如果你創建一個NSString並將它添加到3個NSMutableArray中,那麼每個數組將會是retain它。

+0

請參閱我添加到Yuji評論的評論。 – SpaceDog 2010-06-21 19:51:18