下面是一段代码,通过 NSMutableArray *myArray
枚举并修改其中的每个 NSMutableDictionary
。我在这段代码中看到的问题是它在枚举时进行了修改。
代码:
for (NSMutableDictionary *aDict in myArray)
{
theDate = [self convertTheDate:[aDict valueForKey:@"date"]];
[aDict setValue:theDate forKey:@"date"];
}
[self passUpdatedDates:myArray];
我应该如何将其修改为安全代码?
最佳答案
你的代码应该没问题(按照 Maddy 在他的评论中描述的那样,对 setObject:forKey:
进行了更改),只要你的数组 myArray
确实是一个数组可变字典。如果数组中的任何字典不可变,那么当您尝试更改字典时此代码将会崩溃。
如果是这种情况,那么您将需要创建每个字典的可变副本,更改有问题的键,然后将修改后的字典保存到数组中的正确索引。为此,您现在必须在枚举数组时修改数组。
执行此操作的简单方法是从快速枚举 (for...in) 更改为 for 循环,该循环对所有索引进行计数,并使用 objectAtIndex 获取每个对象、更改它并将其保存回数组.
要继续使用快速枚举,您可以创建一个与 myArray 大小相同的新可变数组,使用 for...in
语法循环遍历 myArray,然后简单地将每个修改过的字典添加到新的可变数组。然后,您使用快速枚举来枚举源数组,并在单独的数组中创建重复的对象。这会使您的内存占用量增加一倍,但会带来快速枚举的性能优势。
关于ios - 在枚举时修改 NSMutableArray 中的 NSDictionary 项的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613973/