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
相关产品推荐
相关产品推荐

