因未捕获的exception’NSGenericException’而终止应用程序,原因:’*** Collection 在枚举时发生了变异

我试图从数组中删除重复的对象。

NSMutableArray* filterResults = [[NSMutableArray alloc] init]; BOOL copy; // remove duplicate if (![arrSelectedVehicle count] == 0) { for (Vehicles *a1 in arrSelectedVehicle) { copy = YES; for (Vehicles *a2 in filterResults) { if ([a1.Vehicle_id isEqualToString:a2.Vehicle_id]) { copy = NO; [arrSelectedVehicle removeObjectIdenticalTo:a2]; break; } } if (copy) { [filterResults addObject:a1]; } } } 

我正在添加两个已经在数组中的对象

在枚举数组时,无法修改数组。 你可以做以下事情:

  NSMutableArray* filterResults = [[NSMutableArray alloc] init]; BOOL copy; // remove duplicate if (![arrSelectedVehicle count] == 0) { NSArray* arraycopy = [arrSelectedVehicle copy]; for (Vehicles *a1 in arraycopy) { copy = YES; for (Vehicles *a2 in filterResults) { if ([a1.Vehicle_id isEqualToString:a2.Vehicle_id]) { copy = NO; [arrSelectedVehicle removeObjectIdenticalTo:a2]; break; } } if (copy) { [filterResults addObject:a1]; } } [arraycopy release]; } 

使用快速枚举时,无法修改数组。 这就是错误告诉你的。 你需要改变循环

 for (NSUInteger i = 0; i < arrSelectedVehicle.count; i++) { Vehicles *a1 = arrSelectedVehicle[i]; copy = YES; for (NSUInteger j = 0; j < filterResults.count; j++) { Vehicles *a2 = filterResults[j]; if ([a1.Vehicle_id isEqualToString:a2.Vehicle_id]) { copy = NO; [arrSelectedVehicle removeObjectIdenticalTo:a2]; break; } } if (copy) { [filterResults addObject:a1]; } } 

您的代码有几个问题。 无论如何,如果您不关心元素的顺序,删除重复项的最简单方法是使用NSSet ,因为NSSet不允许重复:

 NSArray *uniqueObjects = [[NSSet setWithArray:arrSelectedVehicle] allObjects]; 

错误信息说明了这一点:当您对其使用快速枚举时,您无法修改可变集合的内容(因为这是错误的)。 您必须制作它的可变副本,并从该副本中删除重复项。

你不能使用for循环,然后在迭代的数组中添加或删除对象(arrSelectedVehicle)。 而是尝试使用可以正常的对象构建新数组。 在循环结束时,您可以将该数组分配回arrSelectedVehicle。