-[__NSCFNumber addObject:]: 无法识别的选择器发送到实例

-[__NSCFNumber addObject:]: unrecognized selector sent to instance

我创建了一个多维数组如下:

NSMutableArray *subArray = [NSMutableArray arrayWithObjects:[NSString string], [NSNumber       numberWithInt:0], [NSMutableArray array], nil];
self.dataArray = [[NSMutableArray alloc] initWithCapacity:9];
for (int i = 0; i < 9; i++) {
    [self.dataArray addObject:subArray];
}

然后当我尝试像这样访问和更改值时

NSNumber *num = self.dataArray[0][1];
int numInt = [num intValue];
NSNumber *newNum = [NSNumber numberWithInt:numInt + 1];
[self.dataArray[0][1] addObject:newNum];
// add item to dataArray
NSMutableArray *tmpArr= self.dataArray[0][2];
[tmpArr addObject:item];
[self.dataArray[0][2] addObject:tmpArr];

但我得到

-[__NSCFNumber addObject:]: unrecognized selector sent to instance

具体是什么问题,没看懂,先谢谢了!

NSNumber *num = self.dataArray[0][1];
int numInt = [num intValue];
NSNumber *newNum = [NSNumber numberWithInt:numInt + 1];
[self.dataArray[0][1] addObject:newNum];       // 3. also, possibly here
// add item to dataArray
NSMutableArray *tmpArr= self.dataArray[0][2];  // 1. here
[tmpArr addObject:item];                      // 2. and here
[self.dataArray[0][2] addObject:tmpArr];

您收到此错误是因为我标记的第一行 tmpArr 实际上是 NSNumber 类型。 NSNumber 是一个 class 集群,这就是您看到 __NSCFNumber 抛出错误的原因。这就是 NSNumber 的私有子 class。

所以抛出错误是因为您试图在不支持它的对象类型上调用 addObject。就我个人而言,我不会在数组中存储超过一种类型的对象,但我不确切知道你在做什么。假设你不改变你存储东西的方式,你可以做的是:

NSMutableArray *tmpArr= self.dataArray[0][2];  
if ([tmpArr isKindOfClass:[NSMutableArray class])
{
    [tmpArr addObject:item];                      
}
else 
{ 
    NSLog(@"Woops, trying to add an object to something that's not a mutable array");
}

每次尝试将对象存储到要从 self.dataArray 中提取的数组时,您都必须执行此操作。这样做是为了验证 tmpArr 是否如您所想。

或者,您可以检查它是否响应 addObject

if ([tmpArr respondsToSelector:@selector(addObject:)])
{
    [tmpArr addObject:item];
}

第二种方式不管class是什么,只要能用addObject的方法就行。

在第一行中,您将数组中的对象视为 NSNumber(显然是):

NSNumber *num = self.dataArray[0][1];

在这里,您将完全相同的对象视为 NSMutableArray:

[self.dataArray[0][1] addObject:newNum];

那是行不通的,因为那个对象是 NSNumber 的一个实例。

我不知道你实现了什么,所以我无法帮助你找到正确的代码,但这就是你的问题所在。也许你只是想写:

[self.dataArray[0][2] addObject:newNum];

您可能应该停止使用 "inner array" 作为数据存储并转而使用适当的子类。目前您的代码几乎不可读,使用适当的对象来存储您的值会大大改善它。


顺便说一句,您的多维数组实际上只是一维的,因为您多次添加完全相同的数组。

您可能想要这样做:

for (int i = 0; i < 9; i++) {
    NSMutableArray *subArray = [NSMutableArray arrayWithObjects:[NSString string], [NSNumber numberWithInt:0], [NSMutableArray array], nil];    
    [self.dataArray addObject:subArray];
}