NSMutableArray removeObjectAtIndex

6
从我的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'

但就在我删除之前,我打印出了数组和索引。它们都不是nil,我没有理由相信为什么会发生这个错误。有任何想法吗?


只需检查您是否正确分配和初始化NSMutableArray。看起来您正在将其初始化为NSArray(它没有removeObjectAtIndex函数)。 - Krishnabhadra
它是一个 NSMuteableArray...被初始化并声明为这样。 - StanLe
请检查一下,您的可变数组是不是在代码中超出了作用域或被重新分配了。 - Ravin
请展示您分配数组的代码行,即 myArray = [某些内容] - EmilioPelaez
如果数组指针为空,就不会抛出这个异常。而索引不是指针,因此它不能为nil。 - Caleb
6个回答

8
我曾经遇到这个问题。我的问题是我不小心使用了类型转换,就像这样。
NSMutablearray * myarray = [[NSMutableArray alloc] init];
myarray =(NSMutableArray*) [mydictionary allkeys];

这样做在一些情况下是有效的...但是如果你处于一个紧密而大规模的循环中,这种方法可能会失败。

我把我的代码改成了:

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

NSMutableArray是区分大小写的。 - Mohamed Jaleel Nazir

7
这个对象是一个NSArray,而不是NSMutableArray

这是一个NSMuteableArray...被初始化并声明为如此。 - StanLe
也许变量类型是NSMutableArray,但根据日志输出,实例似乎是NSArray。一定要仔细检查对象的实际创建位置。 - ThomasW
@Caleb在下面回答了为什么你的NSArray不是NSMutable array。另外请参考以下链接:https://dev59.com/i3A75IYBdhLWcg3wkaCA - ThomasW
也许您需要在接口中将其定义为NSMutableArray? - Ryan
@rncrtr 问题不在接口,而是实例分配或赋值的位置出了问题。 - ThomasW

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

因此,请开始查找代码中重新分配数组指针的地方。毕竟,如果您的指针确实指向可变数组,那么很难解释您正在遇到的异常。


4
您正在对NSArray实例调用removeObjectAtIndex方法。从您的崩溃日志中可以清楚地看到。

4
错误表明您试图在NSArray上调用removeObjectAtIndex选择器,而NSArray不会响应该选择器。请确保数组确实是NSMutableArray,而不是NSArray。

0

我曾经遇到过同样的问题,原因是使用了copy方法。我自己写了一个返回NSMutableArray*的方法,问题得以解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接