JSON中0.0值转为NSCFNumber 0xb000000000000005问题排查与检测
解决JSON解析0.0时出现特殊_NSCFNumber实例的问题
这个问题其实是Objective-C处理JSON浮点数时的常见小陷阱——你看到的0xb000000000000005只是NSNumber对象的内存地址,不是它的实际数值!调试器显示的这个地址容易误导人,但本质上这个NSNumber存储的还是0.0,只是因为底层优化(比如NSNumber的单例复用机制)生成了一个特殊的实例对象。
问题根源
当NSJSONSerialization解析JSON里的0.0时,可能会复用一个内部优化的NSNumber实例,它的指针地址看起来奇怪,但数值是正确的。你直接赋值给myValue后,调试器默认显示对象地址而非数值,才会让你误以为是错误的值。
解决方案
你不需要纠结这个奇怪的指针地址,只需要通过数值判断来检测它是否为0.0,或者在赋值时显式转换来统一类型:
1. 正确检测数值是否为0.0
不要通过指针地址判断,而是用NSNumber的数值比较方法:
// 方法1:用isEqualToNumber做精确比较 if ([self.myValue isEqualToNumber:@0.0]) { // 确认是0.0 } // 方法2:转换为double后直接比较 if (self.myValue.doubleValue == 0.0) { // 确认是0.0 }
2. 赋值时显式转换,消除特殊实例影响
如果担心后续处理中出现类型兼容问题,可以在赋值时把原始值转换成double再重新包装成NSNumber:
id rawValue = [dictionary objectForKey:@"MyValue"]; if ([rawValue isKindOfClass:[NSNumber class]]) { self.myValue = @([rawValue doubleValue]); } else { // 处理非NSNumber的异常情况,比如设置默认值 self.myValue = @0.0; }
这样不管解析出来的NSNumber是哪种内部优化实例,都会被转换成标准的double类型对应的NSNumber,彻底消除特殊实例的干扰。
3. 额外提示:区分整数与浮点数
如果你的JSON里MyValue可能同时出现整数(比如0)和浮点数(比如0.0),可以用[myValue isInteger]判断类型,但如果只关心数值是否为0,前面两种方法已经足够。
内容的提问来源于stack exchange,提问作者David Findlay
相关产品推荐
相关产品推荐

