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