慎用BOOL!

2016-06-27  本文已影响607人  ttcloud

今天学习到了Mattt Thompson的文章BOOL / bool / Boolean / NSCFBoolean,才发现自己自己之前用的多糊涂,以前一直觉得bool和BOOL感觉没啥差别,都是判断真值,要么是0要么是1,然而,真相并不是这样...
按照matte的实例,我测试了一组:

static BOOL different (int a, int b) {
    return (a - b);
}

- (void)viewDidLoad
 {
    [super viewDidLoad];
    BOOL test=different(3, 7);
    NSLog(@"test:%d",test);
} 

然而输出的结果竟然是-4!!!说好的0和1呢???
按照mattt所说的是因为BOOL在实际中被typedef为signed char

从算数运算中提取真值并不是一个好主意,它可能符合语法(毕竟,BOOL是一个signed char,因此它可以被视为数字),但是它在语意上完全说不通。所以,取而代之的方法是,使用==输出的结果,或者将数值通过!(或者!!)转换成布尔值。

然后百度得到的关于bool和BOOL的资料是这样说的

说明:objective-c 中的BOOL 实际上是一种对带符号的字符类型(signed char)的类型定义(typedef),它使用8位的存储空间。通过#define指令把YES定义为1,NO定义为0。
注意:objective-c 并不会将BOOL作为仅能保存YES或NO值的真正布尔类型来处理。编译器仍将BOOL认作8位二进制数,YES 和 NO 值只是在习惯上的一种理解。
问题:如果不小心将一个大于1字节的整型值(比如short或int)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。如果该低位字节刚好为0(比如8960,写成十六进制为0x2300),BOOL值将会被认作是0,即NO值。而对于bool类型,只有true和false的区别,即0为false,非0为true。

具体区别为

1、类型不同
BOOL为int型; bool为布尔型
2、长度不同
bool只有一个字节 ;BOOL长度视实际环境来定,一般可认为是4个字节
3、取值不同
bool取值false和true,是0和1的区别 ;BOOL取值FALSE和TRUE,是0和非0的区别
BOOL是微软定义的typedef int BOOL(在windef.h中),0为FALSE,1为TRUE。(-1和2既不是TRUE也不是FALSE)。
bool取值false和true,0为false,非0为true。(例如-1和2都是true)。

附表如下:

| Name | Typedef | Header | True Value | False Value |
|: --------: |:--------:|:--------:|:--------:|:--------:|
| BOOL | signed char | objc.h |YES|NO|
| bool | _Bool (int) | stdbool.h |true|false|
| Boolean | unsigned char | MacTypes.h |TRUE|FALSE|
| NSNumber | __NSCFBoolean | Foundation.h |@(YES)|@(NO)|
| CFBooleanRef | struct | CoreFoundation.h | kCFBooleanTrue | kCFBooleanFalse |

注意:进行条件判断时候不要加==来判断,很容易出错

参考:BOOL / bool / Boolean / NSCFBoolean

--------续上----------
前面测试BOOL类型返回为-4的例子,自己测了是-4,但是朋友们测出来是1,刚开始一直没弄明白为什么会这样,一模一样的代码,结果却不同,后来查了资料才知道

{8E2E4D14-D758-65E9-9CBC-11352D357059}.png

mac终端和手机终端对于bool的定义是不同的,可自行验证,对于bool还有很多值得研究的,再有新内容继续续上

上一篇下一篇

猜你喜欢

热点阅读