Objective-C修改可变容器中的元素

时间:2011-05-12 23:30:25

标签: objective-c ios

我需要一些关于在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对象。

我很感激有关如何处理此类情况的一些建议。用新的容器显式替换可变容器中的修改对象是否更好,还是完全没必要?

1 个答案:

答案 0 :(得分:2)

在任何情况下都不是您创建的NSMutableDictionary的副本。当您致电[countries objectAtIndex: 0]时,您将获得对NSMutableDictionary数组中相同countries对象的引用。因此,您对此对象所做的任何修改都将自动反映在countries数组返回的实例中。

简而言之,您有两个指向单个对象实例的指针,修改可变集合类型的内容不会生成集合的复制实例。