【问题标题】:NSMutableArray removeObjectAtIndexNSMutableArray removeObjectAtIndex
【发布时间】:2011-07-13 04:35:25
【问题描述】:

从我的 NSMutableArray 中删除时出现以下错误

-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x1cdced10
2011-07-13 00:33:14.333 MassText[1726:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x1cdced10'

然而,在我删除之前,我打印出数组和索引。两者都不是零,我没有理由相信为什么会发生这个错误。有什么想法吗?

【问题讨论】:

  • 只需检查您是否正确分配和初始化 NSMutableArray..似乎您将其初始化为 NSArray(它没有 removeObjectAtIndex 函数)
  • 它是一个 NSMuteableArray...已初始化并声明为这样。
  • 请检查,您的 mutablearray 是否超出范围或在代码中的某处被重新分配。
  • 向我们展示您分配数组的位置,类似于myArray = [Something something]的行
  • 如果数组指针为nil,则不会抛出此异常。而且索引不是指针,所以不能为零。

标签: iphone objective-c ios uiviewcontroller nsmutablearray


【解决方案1】:

我遇到了这个问题。我的是我不小心使用了这样的类型转换。

NSMutablearray * myarray = [[NSMutableArray alloc] init];
myarray =(NSMutableArray*) [mydictionary allkeys];

这将工作一段时间.. 但如果你处于一个紧凑而大的循环中,这往往会失败。

我把代码改成了

NSMutableArray * myarray= [[NSMutablearray alloc] initWithArray:[mydictionary allKeys]];

【讨论】:

  • NSMutableArray 区分大小写(编辑您的答案)
【解决方案2】:

对象是NSArray,而不是NSMutableArray

【讨论】:

  • 这是一个 NSMuteableArray...已初始化并声明为这样。
  • 也许变量类型是 NSMutableArray,但给定日志输出,实例似乎是 NSArray。请务必仔细检查对象的实际创建位置。
  • @Caleb 下面给出了为什么您的 NSArray 不是 NSMutable 数组的答案。另请参阅以下内容:stackoverflow.com/questions/3220120/…
  • 可能需要在界面中定义为NSMutableArray?
  • @rncrtr 问题不在于接口,问题在于实例实际分配或分配的位置。
【解决方案3】:

您正在对 NSArray 实例调用 removeObjectAtIndex。我们可以通过您的崩溃日志清楚地看到。

【讨论】:

    【解决方案4】:

    此时,四个聪明人(不包括我自己)指出,您将-removeObjectAtIndex: 发送到一个认为它是不可变数组的对象。这将是开始思考为什么数组是不可变的好时机,而您之前认为它是可变的。如果您发布一些代码来显示数组是如何创建的,那么这里的某人可能会向您展示出了什么问题。

    当你认为你有一个可变数组时,你可以最终得到一个不可变数组的一种方法是复制一个可变数组。例如,您可能有一个属性:

    @property (copy) NSMutableArray *myArray;
    

    也许你然后创建一个可变数组,添加一些对象,并将其分配给你的属性:

    NSMutableArray *tempArray = [NSMutableArray array];
    [tempArray addObject:@"You say goodbye"];
    [tempArray addObject:@"I say hello"];
    self.myArray = tempArray;
    

    现在,tempArray 是指向可变数组还是不可变数组?我最近没有测试过,但我很确定你得到了一个不可变的数组。如果你说,你肯定会得到一个 immutableArray:

    NSMutableArray *foo = [tempArray copy];
    

    因此,开始在代码中寻找重新分配数组指针的位置。毕竟,如果您的指针确实指向一个可变数组,那么您将很难解释您遇到的异常。

    【讨论】:

      【解决方案5】:

      错误表明您正在尝试调用 NSArray 上的 removeObjectAtIndex 选择器,它不会响应该选择器。

      确保数组确实是一个 NSMutableArray,而不是 NSArray

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,是因为使用了复制方法。我自己做了一个返回一个 NSMutableArray* 并且它起作用了。

        【讨论】:

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