Objective c -[\uu NSCFNumber addObject:]:发送到实例的选择器无法识别

Objective c -[\uu NSCFNumber addObject:]:发送到实例的选择器无法识别,objective-c,nsmutablearray,Objective C,Nsmutablearray,我创建了一个多维数组,如下所示: 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+

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

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];
}
但是我越来越

-[__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
是一个类集群,这就是为什么您看到
\uu NSCFNumber
抛出错误的原因。所有这些都只是
NSNumber
的一个私有子类

因此抛出错误是因为您试图对不支持它的对象类型调用
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];
}

第二种方法不关心它是什么类,只要可以使用方法
addObject

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

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

[self.dataArray[0][1] addObject:newNum];
这不起作用,因为该对象是NSNumber的实例

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

[self.dataArray[0][2] addObject:newNum];
您可能应该停止使用“内部数组”作为数据存储,转而使用合适的子类。目前,您的代码几乎不可读,使用适当的对象来存储您的值将大大提高代码的可读性


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

您可能想这样做:

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

@HotLicks我知道它发生在哪里,我只是不明白为什么…读这个副本。答案解释了这一点。(self.dataArray[0][1]??)的值是多少?“self.dataArray[0][1]”是NSNumber,而NSNumber没有名为“addObject”的API。
[self.dataArray[0][2] addObject:newNum];
for (int i = 0; i < 9; i++) {
    NSMutableArray *subArray = [NSMutableArray arrayWithObjects:[NSString string], [NSNumber numberWithInt:0], [NSMutableArray array], nil];    
    [self.dataArray addObject:subArray];
}