cocoa_chen

论boolValue的重要性

2015-05-12

背景

今天遇到了一个旧项目中的bug,排查半天发现是Number转换成Bool后返回的值不确定导致的。以下是相关的测试代码:

1
2
3
4
5
6
_testDict = [NSMutableDictionary dictionary];
[_testDict setObject:[NSNumber numberWithBool:YES] forKey:@"key"];
BOOL testValue = [_testDict objectForKey:@"key"];
if (testValue) {
//执行后面的逻辑
}

接着在手上的几个机器上测试了上述代码,发现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
2
id value = [_testDict objectForKey:@"key"];
NSLog(@"%p",value);

接着在刚才提到的iPhone5上运行,发现打印结果是0x37b2b900(注:不同机器打印值不同),接着在转换为BOOL值时用低8位00来转换,自然结果就是NO了。

综上所述,获取BOOL值时最好还是加上boolValue吧,尤其是旧工程中的代码,最好也跟着修改一下。最后,不得不感慨一下代码规范化的重要性啊!

Tags: iOS
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章