You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSNumber转long报错:[__NSSingleObjectArrayI intValue]无法识别选择器

嘿,这个问题我太熟了!咱们来一步步拆解:

问题根源

你看到的错误[__NSSingleObjectArrayI intValue]: unrecognized selector sent to instance已经给出了关键线索——你以为dbversion是NSNumber,但实际上它是一个只包含单个元素的NSArray(__NSSingleObjectArrayI就是数组的私有子类)。

为什么会这样?因为settings是NSArray,数组调用valueForKey:的行为和字典完全不一样:

  • 字典的valueForKey:是直接返回对应键的值;
  • 数组的valueForKey:会遍历数组里的每一个元素,对每个元素调用valueForKey:@"Version",然后把所有结果打包成一个新数组返回给你。哪怕数组里只有一个字典元素,返回的依然是数组,不是单个值。

你的代码问题

你的代码里:

NSNumber *dbversion = [settings valueForKey:@"Version"];

这里dbversion实际是NSArray *类型,你把它强转成了NSNumber *,后续调用longValue时,本质是给数组发了这个消息,数组没有这个方法,所以直接崩溃了。

解决方案

你需要先从数组里取出对应的字典元素,再从字典里取Version值:

方案1(假设数组里只有一个字典元素)

// 先取数组里的第一个字典对象
NSDictionary *settingsDict = settings.firstObject;
// 再从字典里拿到Version对应的NSNumber
NSNumber *dbversion = [settingsDict valueForKey:@"Version"];
long dbver = [dbversion longValue];

方案2(如果数组里有多个元素,需要遍历处理)

for (NSDictionary *dict in settings) {
    NSNumber *dbversion = [dict valueForKey:@"Version"];
    long dbver = [dbversion longValue];
    // 这里处理每个元素对应的版本号
}

另外小建议:如果不需要KVC的特殊特性,推荐用objectForKey:替代valueForKey:,这是字典的原生方法,更直接也更不容易出错:

NSNumber *dbversion = [settingsDict objectForKey:@"Version"];

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:01:27