【问题标题】:-[__NSCFNumber addObject:]: unrecognized selector sent to instance [duplicate]-[__NSCFNumber addObject:]:无法识别的选择器发送到实例 [重复]
【发布时间】:2015-03-03 12:27:05
【问题描述】:

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

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

究竟是什么问题,我不明白,提前谢谢!

【问题讨论】:

  • @HotLicks 我知道它发生在哪里,我只是不明白为什么......
  • 阅读骗局。答案解释了它。
  • self.dataArray[0][1]的值是多少??)
  • "self.dataArray[0][1]" 是 NSNumber 并且 NSNumber 没有名为“addObject”的 API。

标签: objective-c nsmutablearray


【解决方案1】:

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

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

在这里,您将完全相同的对象视为 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];
}

【讨论】:

    【解决方案2】:
    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 是一个类集群,这就是您看到 __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方法即可。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      相关资源
      最近更新 更多