因未捕获的异常'NSGenericException'而终止应用程序,原因:'*** Collection< __ NSArrayM:0x138cb4d0>在被列举时被突变

时间:2013-01-04 06:50:07

标签: objective-c ios

我正在尝试从数组中删除重复的对象。

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

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

5 个答案:

答案 0 :(得分:6)

在枚举数组时无法修改数组。你可以做到以下几点:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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