使用removeObjectsInArray时发生崩溃:[NSArray arrayWithArray:]

时间:2014-09-15 16:33:14

标签: objective-c

self.filteredProducts = [[NSMutableArray alloc] init];

    //Find products
    self.filteredProducts = (NSMutableArray*)[(NSMutableDictionary *)[self.CECategoriesDictionary objectForKey:category.categoryGuid] allValues];

    if([self.oldfilteredProducts count] > 0 && selectedLevel==5)
    {
        NSMutableArray *diff = [self.filteredProducts mutableCopy];
        [diff removeObjectsInArray:[NSArray arrayWithArray:self.oldfilteredProducts]];
        [self.filteredProducts removeObjectsInArray:[NSArray arrayWithArray:diff]];
    }

日志:

[__ NSArrayI removeObjectsInArray:]:无法识别的选择器发送到实例0x1aed19d0 2014-09-15 22:00:19.243 SAPRetailEx [10325:90b] [错误]:未捕获异常: - [__ NSArrayI removeObjectsInArray:]:无法识别的选择器发送到实例0x1aed19d0 2014-09-15 22:00:19.243 SAPRetailEx [10325:90b] [错误]: - [__ NSArrayI removeObjectsInArray:]:无法识别的选择器发送到实例0x1aed19d0 2014-09-15 22:00:19.248 SAPRetailEx [10325:90b] [错误] :(

2 个答案:

答案 0 :(得分:5)

您无法从NSArray删除对象;我知道你认为你使用的是NSMutableArray,但事实并非如此。从错误[__NSArrayI removeObjectsInArray:]: unrecognized selector可以清楚地看出这一点; __NSArrayI是一个不可变对象(这就是I的含义),如果这是一个可变数组,那么该类将是__NSArrayM

您似乎在错误的印象下操作,即只需将NSArray转换为NSMutableArray即可获得可变数组;这已经永远不会如何在任何C派生语言下运行。您需要向mutableCopy发送NSArray消息。当然,您现在拥有阵列的副本,因此修改不会反映在原始版本中。您还拥有该副本,因此如果您不使用ARC,则在完成后需要release副本。

我很想知道为什么你已经mutableCopy self.filteredProducts,然后还试图直接从self.filteredProducts删除。即使你按照预期的方式工作,你现在正在无缘无故地复制阵列,然后从你和原来的#34;和#34;复制"。

答案 1 :(得分:0)

self.filteredProducts不是NSMutableArray它只是一个普通的NSArray,它没有"删除选项"

[self.filteredProducts removeObjectsInArray:[NSArray arrayWithArray:diff]

为了将来的帮助...在分配代码后设置代码中的断点,然后打印出描述并查看它实际是什么类型的对象。调试器中的po或右键单击"打印说明"。不要相信左侧面板上的内容,这就是您告诉代码对象的内容,请查看右侧的说明,了解它的真实含义。

enter image description here