我需要一些关于在Objective-C中修改存储在可变容器中的对象的澄清/建议。
假设我有一个名为NSMutableArray
的{{1}},其中countries
存储了有关每个NSMutableDictionaries
的详细信息。
country
稍后我想修改NSMutableArray *countries = [[NSMutableArray alloc] init];
NSMutabelDictionary *country = [[NSMutableDictionary alloc] init];
[country setObject: @"United States" forKey: @"Name"];
[countries addObject: country];
中存储的country
。我可以这样做:
countries
或作为:
[[countries objectAtIndex: 0] setObject: @"United States of America" forKey: @"Name"];
结果是一样的。在我的C ++背景下,我首先想到NSMutableDictionary *cnt = [countries objectAtIndex: 0];
[cnt setObject: @"United States of America" forKey: @"Name"];
[countries replaceObjectAtIndex: 0 withObject: cnt];
将是位于cnt
中位置0的对象的副本,并且在我修改它之后我必须将修改后的对象放回countries
}。但是,即使我没有向countries
消息发送,数组countries
仍将保留更新的country
对象。
我很感激有关如何处理此类情况的一些建议。用新的容器显式替换可变容器中的修改对象是否更好,还是完全没必要?
答案 0 :(得分:2)
在任何情况下都不是您创建的NSMutableDictionary
的副本。当您致电[countries objectAtIndex: 0]
时,您将获得对NSMutableDictionary
数组中相同countries
对象的引用。因此,您对此对象所做的任何修改都将自动反映在countries
数组返回的实例中。
简而言之,您有两个指向单个对象实例的指针,修改可变集合类型的内容不会生成集合的复制实例。