2011-05-12 26 views
0

我需要相關修改存儲在目標C可變容器對象一些澄清/建議。 比方說,我有一個名爲NSMutableArray其中countries裏面有一些存儲每個country細節NSMutableDictionaries在可變容器Objective-C的改性元素

NSMutableArray *countries = [[NSMutableArray alloc] init]; 

NSMutabelDictionary *country = [[NSMutableDictionary alloc] init]; 
[country setObject: @"United States" forKey: @"Name"]; 

[countries addObject: country]; 

後來我想修改存儲在countries一個country。我可以做到這一點無論是作爲:

[[countries objectAtIndex: 0] setObject: @"United States of America" forKey: @"Name"]; 

或爲:

的結果是一樣的。隨着我的C++的背景下,我首先想到的是cnt將在countries駐留在位置0的對象的副本後,我修改我必須把修改的對象爲countries。然而,陣列countries仍然持有,即使我不把它的replaceObjectAtIndex消息更新country對象。

我將不勝感激就如何處理這種情況一些建議。用新的變量容器顯式替換可變容器中的修改對象是否更好?還是完全沒有必要?

+2

確實完全沒有必要。請參閱:http://stackoverflow.com/questions/5915711/can-we-use-nsmutable-objects-as-members-of-a-non-nsmutable-class/5915831#5915831 – 2011-05-12 23:38:59

+1

的Objective-C沒有功能如C++中的傳值或複製語義。 – 2011-05-12 23:41:28

+0

好的,如果我從數組'國家'中刪除'country',該怎麼辦?我從數組中移除後仍然需要釋放'country'字典嗎?根據評論我會承擔是的,但是當我嘗試這個時,程序崩潰了。 – kadam 2011-05-13 00:00:58

回答

2

在兩種情況下是創建了NSMutableDictionary的副本。當你調用[countries objectAtIndex: 0]你得到相同的NSMutableDictionary對象,它是countries陣列中的一個參考。因此,對此對象所做的任何修改都將自動反映在由countries陣列返回的實例中。

總之,你有兩個指針指向一個對象實例,並修改可變集合類型的內容不會產生集合的複製的實例。