2014-05-12 48 views
0

下面是一段代码,其中列举了NSMutableArray *myArray并修改其中的每个NSMutableDictionary。我用这段代码看到的问题是它在枚举时正在修改。在枚举时修改NSMutableArray中的NSDictionary项目的正确方法是什么?

代码:

for (NSMutableDictionary *aDict in myArray) 
{ 
    theDate = [self convertTheDate:[aDict valueForKey:@"date"]]; 

    [aDict setValue:theDate forKey:@"date"]; 
} 

[self passUpdatedDates:myArray]; 

我应该如何修改这个是安全的代码?

+2

这完全没问题,因为你并没有改变阵列本身。 – vikingosegundo

+4

仅供参考 - 您不应该使用'valueForKey:'或'setValue:forKey:'。除非明确需要键值编码(KVC),否则使用'objectForKey:'和'setObject:forKey:'。 – rmaddy

+0

您可以在枚举数组的同时将其中一个内容对象修改为心脏的内容,只要您不在枚举的数组中替换旧对象。 –

回答

1

只要您的数组myArray确实是一个可变字典数组,您的代码应该没问题(随着Maddy在他的评论中描述,更改为setObject:forKey:)。如果数组中的任何字典都不可变,那么当您尝试更改字典时,此代码将崩溃。

如果是这种情况,那么您需要创建每个字典的可变副本,更改有问题的密钥,然后将修改后的字典保存到数组中的正确索引。要做到这一点,您现在必须在枚举数组时处理修改数组。

执行此操作的简单方法是将快速枚举(for ... in)更改为通过所有索引进行计数的for循环,并使用objectAtIndex来获取每个对象,将其更改并保存回阵列。

要继续使用快速枚举,可以创建一个与myArray大小相同的新可变数组,并使用for... in语法循环myArray,并将每个已修改的字典添加到新的可变数组中。然后,您使用快速枚举枚举源数组,并在单独的数组中创建一个重复对象。这增加了你的内存占用量,但给你快速枚举的性能优势。

相关问题