Objective-C2.0和快速枚举抛出异常

Objective-C2.0和快速枚举抛出异常,objective-c,cocoa,cocoa-touch,enumeration,Objective C,Cocoa,Cocoa Touch,Enumeration,我有一个类似于以下内容的代码块: for (NSDictionary *tmp in aCollection) { if ([[bar valueForKey:@"id"] isEqualToString:[tmp valueForKey:@"id"]]) { break; } else { [aCollection addObject:bar]; } } 从技术上讲,这是Objective-C2.0中的一个例外吗?似乎无法

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

for (NSDictionary *tmp in aCollection) {
   if ([[bar valueForKey:@"id"] isEqualToString:[tmp valueForKey:@"id"]])
   {
      break;
   }
   else
   {
      [aCollection addObject:bar];
       }
 }
从技术上讲,这是Objective-C2.0中的一个例外吗?似乎无法使用快速枚举对集合进行变异。这是一个错误的结果:

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <NSCFArray: 0x396000> was mutated while being enumerated.'
***由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“***集合在枚举时发生了变异。”
解决此问题的最佳方法是什么?

从中,您不能修改正在枚举的集合:

枚举是“安全的”-枚举数具有变异保护,因此,如果您在枚举期间尝试修改集合,将引发异常


制作集合的副本并迭代该集合。然后,您可以调出或添加到原始集合中,而不会出现任何问题。

解决此问题的方法是,在枚举数组时不要对其进行变异(例如添加对象):)

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

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

试试这个

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

if (!found)
{
 [aCollection addObject:bar];
}
线路

[aCollection addObject:bar]
这是你的问题。枚举集合时不能修改它。更好的方法是创建一个临时的
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];

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

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

其他人都给出了有用的答案,所有这些答案似乎都是正确的

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

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

每个人都认为,如果在收藏中根本不存在bar,那么您正在尝试添加它


我怀疑您使用了Python构造,并将其移植错误。

已解决

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

不要更改循环运行所依赖的数组中的子对象

例如,如果我在循环中更改/修改对象。。它将给出这个错误

 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 
 }

当你可以在
[aCollection copy]
上进行迭代时,为什么还要费心去做这些呢?这是一个注释,不是一个问题。不过,你可能是对的:)