以下是一段代码片段,它通过NSMutableArray *myArray
枚举并修改其中的每个NSMutableDictionary
。我在这段代码中看到的问题是它在枚举时正在修改。
代码:
for (NSMutableDictionary *aDict in myArray)
{
theDate = [self convertTheDate:[aDict valueForKey:@"date"]];
[aDict setValue:theDate forKey:@"date"];
}
[self passUpdatedDates:myArray];
我应该如何将其修改为安全代码?
答案 0 :(得分:1)
只要您的数组setObject:forKey:
确实是一组可变字典,您的代码应该没问题(如他的评论中所述的Maddy更改为myArray
)。如果数组中的任何字典不可变,那么当您尝试更改字典时,此代码将崩溃。
如果是这种情况,则需要创建每个字典的可变副本,更改有问题的密钥,然后将修改后的字典保存到数组中的正确索引。要做到这一点,你现在必须在枚举时处理修改数组。
执行此操作的简单方法是从快速枚举(for ... in)更改为遍历所有索引的for循环,并使用objectAtIndex获取每个对象,更改它并将其保存回数组
要继续使用快速枚举,您可以创建一个与myArray大小相同的新可变数组,使用for... in
语法循环遍历myArray,并将每个修改后的字典添加到新的可变数组中。然后,您使用快速枚举枚举源数组并在单独的数组中创建重复对象。这会使您的内存占用倍增,但会为您提供快速枚举的性能优势。