美文网首页
慎用BOOL!

慎用BOOL!

作者: ttcloud | 来源:发表于2016-06-27 12:41 被阅读607次

    今天学习到了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还有很多值得研究的,再有新内容继续续上

    相关文章

      网友评论

          本文标题:慎用BOOL!

          本文链接:https://www.haomeiwen.com/subject/ixyzdttx.html