从NSMutableArray中删除项目时应用程序崩溃,但仅在满足某些条件时才会崩溃

时间:2016-07-31 05:43:22

标签: ios objective-c nsmutablearray sigabrt

我有一个用Objective-C编写的应用,需要显示UITable个数字。数字列表取自NSMutableArray,其信息来自.plist文件。通常,一切都很好。

但是,该应用程序包含以特定方式组织数字的设置。默认设置只是按字母顺序组织它们。下一个将它们反向组织为默认值。这两个设置很好。当通过分割奇数和偶数来选择组织表的设置时,会出现问题。这是拆分它们的代码:

for (int i = 0; i < [tempGeneralSorterArray count]; i++)
{
    NSString *tempHouseNumber = [[tempGeneralSorterArray objectAtIndex:i] stringByTrimmingCharactersInSet:letters];
    int tempHouseNumberValue = [tempHouseNumber intValue];

    if (tempHouseNumberValue % 2 == 0) //% is the modulo operator, shows what's left after a division
    {
        //even
        [tempEvenSorterArray addObject:[tempGeneralSorterArray objectAtIndex:i]];
        [tempEvenSorterArray sortUsingSelector:@selector(compare:)];
    }
    else
    {
        //odd
        [tempOddSorterArray addObject:[tempGeneralSorterArray objectAtIndex:i]];
        [tempOddSorterArray sortUsingSelector:@selector(compare:)];
    }
}

在此之后,应用程序根据所选的设置以不同的方式组合两个数组(tempOddSorterArray和tempEvenSorterArray),但通常如下:

customerArray = [tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray];

表格显示很好,但是当我尝试删除单元格时,出现错误。它在这一行崩溃了:

[customerArray removeObjectAtIndex:indexPath.row];

我在调试器中得到了这个:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fae62410f30'

任何帮助都将不胜感激,如果需要,我很乐意提供更多信息或代码。

此外,此处使用的所有数组都是NSMutableArrays。

2 个答案:

答案 0 :(得分:2)

虽然customerArray已被声明为可变,但[tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray]返回一个不可变数组。尝试像[[tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray] mutableCopy]一样修改它;让我知道它是否嗡嗡作响。 :)

答案 1 :(得分:-1)

事实证明

 customerArray = [tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray];

返回一个新的NSArray实例,但不返回NSMutableArray实例。而您需要一个NSMutableArray类型的实例来调用removeObject方法。 您可以通过在收到NSArray后调用mutableCopy方法来实现此目的。这就是你如何做到的:

 customerArray = [[tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray] mutableCopy];

 [customerArray removeObjectAtIndex:indexPath.row];

您也可以尝试以下方法,因为@Droppy声称它是更有效的方法,

NSMutableArray * customerArray; 
[customerArray addObjectsFromArray: tempEvenSorterArray];