在枚举时修改NSMutableArray中的NSDictionary项的正确方法是什么?

时间:2014-05-12 16:15:38

标签: ios objective-c cocoa-touch nsarray nsdictionary

以下是一段代码片段,它通过NSMutableArray *myArray枚举并修改其中的每个NSMutableDictionary。我在这段代码中看到的问题是它在枚举时正在修改。

代码:

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

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

[self passUpdatedDates:myArray];

我应该如何将其修改为安全代码?

1 个答案:

答案 0 :(得分:1)

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

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

执行此操作的简单方法是从快速枚举(for ... in)更改为遍历所有索引的for循环,并使用objectAtIndex获取每个对象,更改它并将其保存回数组

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