当前位置:  开发笔记 > IOS > 正文

Objective-C 2.0和Fast Enumeration抛出异常

如何解决《Objective-C2.0和FastEnumeration抛出异常》经验,为你挑选了3个好方法。

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

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  was mutated while being enumerated.'

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



1> Andrew Grant..:

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

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

在您的情况下解决此问题的最简单方法是修复代码中的错误.你的代码正在为数组中的每个项目执行"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];
}



2> Alex Wayne..:

制作该集合的副本并进行迭代.然后您可以更换或添加到原始集合而不会出现问题.



3> Alex..:

这条线

[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];


当你可以迭代`[aCollection copy]时,为什么还要费心去做所有这些?
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有