【问题标题】:Crash happening when using removeObjectsInArray:[NSArray arrayWithArray:] [duplicate]使用 removeObjectsInArray:[NSArray arrayWithArray:] [重复] 时发生崩溃
【发布时间】:2014-11-09 06:05:47
【问题描述】:

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] [错误]:(

【问题讨论】:

  • 您可能想尝试使用调试器检查设置后diff 的对象类型。它必须是 NSMutableArray 才能工作。另外,调用removeObjectsInArray: 时不需要使用NSArray arrayWithArray:。您只是在浪费 CPU 和 RAM 来创建不需要的数组。
  • 你不能改变一个不可变的对象。 (这就是异常消息清楚地告诉你的内容。)

标签: objective-c


【解决方案1】:

您不能从NSArray 中删除对象;我知道你认为你正在使用NSMutableArray,但你没有。从您的错误[__NSArrayI removeObjectsInArray:]: unrecognized selector 中可以清楚地看出这一点; __NSArrayI 是一个不可变对象(这就是 I 的意思),如果这真的是一个可变数组,那么类将是 __NSArrayM

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

我很想知道为什么你已经制作了mutableCopyself.filteredProducts 然后还试图直接从self.filteredProducts 中删除。即使这如您所期望的那样有效,您现在无缘无故地复制数组,然后从您的“原始”和“副本”中删除。

【讨论】:

  • 我如何将 self self.filteredProducts 转换为 NSMutableArray 以便我可以从中删除与我需要的 diff 数组中相同的对象。
  • @NehitGurubaxani 您需要将 self.filteredProducts 声明为 NSMutableArray 然后在为它分配 NSArray 的地方改为使用 self.filteredProducts = [theArray mutableCopy]. However, looking at your code that will be the same as diff` 所以我不知道你想做什么。
【解决方案2】:

self.filteredProducts 并不是真正的NSMutableArray,它只是一个没有“删除选项”的普通NSArray

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多