-[__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];
}
我创建了一个多维数组如下:
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];
}