我有一個已保留的可變數組。iphone - 將保留屬性傳播一個數組?
該數組包含帶有許多鍵的字典。每個字典都包含對象。
我必須在將字典添加到可變數組之前保留字典,否則數組本身會保留添加到它的所有內容(因爲它已保留),包括其對象在分層結構中的子對象?
謝謝。
我有一個已保留的可變數組。iphone - 將保留屬性傳播一個數組?
該數組包含帶有許多鍵的字典。每個字典都包含對象。
我必須在將字典添加到可變數組之前保留字典,否則數組本身會保留添加到它的所有內容(因爲它已保留),包括其對象在分層結構中的子對象?
謝謝。
基礎容器,例如NSArray
或NSDictionary
,保留它直接擁有的對象,但不包含對象擁有的子對象。
例如,如果NSArray*a
包含NSArray*b
而且又包含NSArray*c
,a
保留b
和b
保留c
但a
不保留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
或沒有,你沒有,如果你需要擔心在通過b
至method:
之前保留b
。
這是因爲Cocoa框架中的每個方法以及您編寫的每個方法都保留傳遞給它的對象b
,如果方法稍後需要它,並且如果稍後不需要保留b
。
Objective-C容器(如NSMutableArray)將保留添加到它們的對象。
然而,這與任何被「傳播」的東西沒有任何關係 - 無論你是否在NSMutableArray上調用-retain
都不相關。 NSMutableArray將簡單地保留添加到它的對象,並且如果這些對象本身是某種容器(例如字典),則子對象本身已經保留添加到它們的任何東西,等等。
ps。沒有真正的「保留屬性」,每個對象都有一個(內部)「保留計數」。例如,如果你創建一個NSString並將它添加到3個NSMutableArray中,那麼每個數組將會是retain
它。
請參閱我添加到Yuji評論的評論。 – SpaceDog 2010-06-21 19:51:18
我的意思是:我有一個可變數組,它在應用程序啓動時會被聲明,並且會被幾種方法使用。一種「全局」數組。有些方法會創建字典,這些字典將被添加到該數組中。這些字典包含對象。在正常情況下,在該方法結束時,如果我不保留它,但這個字典會丟失或泄漏,但是當我將它添加到一個保留的可變數組時,我不知道在添加之前是否必須保留字典。 .. – SpaceDog 2010-06-21 19:51:01
增加了更多的單詞...... – Yuji 2010-06-21 22:48:44
thanksssssssssssssss !!!!!!!!!!! – SpaceDog 2010-06-24 03:45:33