美文网首页
Ojbective-C 中BOOL若干陷阱

Ojbective-C 中BOOL若干陷阱

作者: Bepawbikvy | 来源:发表于2019-02-21 18:29 被阅读0次

    将普通整形转换成 BOOL 时要小心。不要直接将 BOOL 值与 YES 进行比较。

    Objective-C 中把 BOOL 定义成无符号字符型,这意味着 BOOL 类型的值远不止 YES``(1)或 ``NO``(0),所以不要直接把整形转换成BOOL。

    常见的错误包括将数组的大小、指针值及位运算的结果直接转换成 BOOL ,取决于整型结果的最后一个字节,很可能会产生一个 NO 值。当转换整形至 BOOL 时,使用三目操作符来返回 YES 或者 NO。(译者注:读者可以试一下任意的 256 的整数的转换结果,如 256、512 …)

    你可以安全在 BOOL、_Bool 以及 bool 之间转换(参见 C++ Std 4.7.4, 4.12 以及 C99 Std 6.3.1.2)。你不能安全在 BOOL 以及 Boolean 之间转换,因此请把 Boolean 当作一个普通整形,就像之前讨论的那样。但 Objective-C 的方法标识符中,只使用 BOOL。

    对 BOOL 使用逻辑运算符(&&,|| 和 !)是合法的,返回值也可以安全地转换成 BOOL,不需要使用三目操作符。

    错误用法:

    - (BOOL)isBold {

    return [self fontTraits] & NSFontBoldTrait;

    }

    - (BOOL)isValid {

        return [self stringValue];

    }

    正确用法:

    - (BOOL)isBold { 

        return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;

    }

     - (BOOL)isValid {

        return [self stringValue] != nil;

    - (BOOL)isEnabled {

        return [self isValid] && [self isBold];

    }

    注:不要直接比较 YES/NO 和 BOOL 变量。不仅影响可读性,更重要的是结果可能与你想的不同。

    如果项目中常用code相关参数用BOOL来进行比较,如果接口code有所变化,或者非0之外的普通整形,那么得到的结果会不一样, 甚至出现了bug.查到起来也比较费劲.

    错误用法:

    BOOL bepa =  [foo isBepa];

    if (bepa == YES) { ... }

    正确用法:

    BOOL bepa = [foo isBepa];

    if (bepa) { ... }

    参考:

         https://blog.csdn.net/Hhrock/article/details/82386014

    相关文章

      网友评论

          本文标题:Ojbective-C 中BOOL若干陷阱

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