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

标签 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];

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

最佳答案

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

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

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

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

关于ios - 在枚举时修改 NSMutableArray 中的 NSDictionary 项的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613973/

相关文章:

iphone - Twitter 和 FB 集成到 iPhone 应用程序

ios - 在 iOS 应用程序中以编程方式获取崩溃报告

ios - 解析检索错误的 PFFile

ios - 如何在 CallKit 框架 swift 中从 ViewController 重新加载扩展?

ios - UITableViewCell 更改删除行按钮的字体

ios - 台风框架 : Swift or Objective-C

iphone - 自定义 UITableViewCell 顶部出现神秘圆线

ios - 如何在 iOS 中的 PDF 文件中绘制表格。

ios - 使用土耳其语无点 i 进行字符串搜索

cocoa-touch - TTModel 加载方法未被调用