背景
今天遇到了一个旧项目中的bug,排查半天发现是Number转换成Bool后返回的值不确定导致的。以下是相关的测试代码:
1 | _testDict = [NSMutableDictionary dictionary]; |
接着在手上的几个机器上测试了上述代码,发现iPhone4/4S/6上testValue为YES,而在iPhone5上testValue却是NO,因此if代码块的代码未执行,导致了界面在iPhone5上出现了显示不一致的问题。
然后我修改了BOOL值的获取代码,改为以下形式后就可以确保返回YES了,从而解决了这个蛋疼的bug:
1 | BOOL testValue = [[_testDict objectForKey:@"key"] boolValue]; |
那么问题来了,为什么不写boolValue就出现了可能返回YES可能返回NO的问题了?
问题原因
BOOL是定义为char类型的,当把一个对象指针转换为BOOL值时,只有低8位会被使用到,这些低8位可能都是0,从而导致转换为BOOL值后返回为NO的情况,而使用boolValue获取BOOL值则不会有这种问题出现。
添加了以下测试代码:
1 | id value = [_testDict objectForKey:@"key"]; |
接着在刚才提到的iPhone5上运行,发现打印结果是0x37b2b900(注:不同机器打印值不同),接着在转换为BOOL值时用低8位00来转换,自然结果就是NO了。
综上所述,获取BOOL值时最好还是加上boolValue吧,尤其是旧工程中的代码,最好也跟着修改一下。最后,不得不感慨一下代码规范化的重要性啊!
赏
使用支付宝打赏
使用微信打赏
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章