5

我有一个类似于以下的代码块:

for (NSDictionary *tmp in aCollection) {
   if ([[bar valueForKey:@"id"] isEqualToString:[tmp valueForKey:@"id"]])
   {
      break;
   }
   else
   {
      [aCollection addObject:bar];
       }
 }

这在技术上是 Objective-C 2.0 中的一个例外吗?看来您无法通过快速枚举来改变集合。这是错误的结果:

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <NSCFArray: 0x396000> was mutated while being enumerated.'

解决这个问题的最佳方法是什么?

4

7 回答 7

12

那么解决它的方法是在枚举它时不要改变数组(例如添加一个对象):)

这里的问题是通过添加/删除元素来修改数组可能会导致枚举值变得无效,因此这是一个问题。

在您的情况下,解决此问题的最简单方法是修复代码中的错误。您的代码正在为数组中的每个项目执行“else add”子句,我很确定这不是您想要的。

尝试这个;

bool found = false;
for (NSDictionary *tmp in aCollection)
{
   if ([[bar valueForKey:@"id"] isEqualToString:[tmp valueForKey:@"id"]])
   {
      found = true;
      break;
   }
}

if (!found)
{
 [aCollection addObject:bar];
}
于 2009-02-16T20:34:12.167 回答
6

制作集合的副本并对其进行迭代。然后,您可以毫无问题地换出或添加到您的原始收藏中。

于 2009-02-16T20:33:53.790 回答
6

线

[aCollection addObject:bar]

是你的问题。aCollection枚举时不能修改。更好的方法是创建一个临时的NSMutableArray,添加bar到那个,然后[aCollection addObjectsFromArray:]用你的临时数组调用。

例如:

NSMutableArray *foundObjects = [NSMutableArray array];
for (NSDictionary *aDictionary in aCollection) {
    if ([[bar objectForKey:@"id"] isEqual:[aDictionary objectForKey:@"id"]])
       break;

    [foundObjects addObject:bar];
}
[aCollection addObjectsFromArray:foundObjects];
于 2009-02-16T20:34:37.687 回答
3

Objective-C 2.0 Programming Language中,您不能修改被枚举的集合:

枚举是“安全的”——枚举器有一个突变保护,因此如果您在枚举期间尝试修改集合,则会引发异常。

于 2009-02-16T20:33:28.627 回答
2

只需复制数组。否则你会弄乱你正在迭代的集合:

for (NSDictionary *tmp in aCollection.copy) {
  if ([[bar valueForKey:@"id"] isEqualToString:[tmp valueForKey:@"id"]])
     break;
  [aCollection addObject:bar];
}
于 2010-11-19T23:57:11.260 回答
1

其他人都提供了有用的答案,所有这些似乎都是正确的。

然而,你的代码并没有像他们认为的那样做。它可能也不会像您认为的那样做。

如果枚举器返回的第一个对象与 bar 不匹配,则尝试将“bar”添加到集合中。

如果集合中根本不存在 bar,每个人都认为您正在尝试添加 bar。

我怀疑您采用了 Python 构造并错误地移植了它。

于 2012-01-27T04:21:28.337 回答
0

解决了

我在 coredata 对象枚举中有同样的问题。

不要更改依赖于循环正在运行的 ARRAY 的子对象

就像,如果我在循环中更改/修改对象..它会给出这个错误

 for (LoadList *objLL in ArrLoadList) {             // here Enumaration is Going on
        // here i has removed objects in ArrLoadList and reassign the ArrLoadList .. 
        // it will gives me this error 
        // So Don't change the Main Array object 
 }
于 2012-02-25T13:56:55.570 回答