美文网首页
Objective-C中的BOOL类型

Objective-C中的BOOL类型

作者: kim_xx | 来源:发表于2019-02-19 16:55 被阅读10次

    以前认为OC中的BOOL类型和其他基本类型一样,都是预设好的关键字,今天看runtime源码的时候才发现不是这样的,看来以后还是要多深入底层看看。

    objc/objc.h类中是这样定义BOOL类型的:

    #if OBJC_BOOL_IS_BOOL
        typedef bool BOOL;
    #else
    #   define OBJC_BOOL_IS_CHAR 1
        typedef signed char BOOL; 
        // BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
        // even if -funsigned-char is used.
    #endif
    

    这里的OBJC_BOOL_IS_BOOL是这样定义的:

    #if defined(__OBJC_BOOL_IS_BOOL)
        // Honor __OBJC_BOOL_IS_BOOL when available.
    #   if __OBJC_BOOL_IS_BOOL
    #       define OBJC_BOOL_IS_BOOL 1
    #   else
    #       define OBJC_BOOL_IS_BOOL 0
    #   endif
    #else
        // __OBJC_BOOL_IS_BOOL not set.
    #   if TARGET_OS_OSX || TARGET_OS_IOSMAC || (TARGET_OS_IOS && !__LP64__ && !__ARM_ARCH_7K)
    #      define OBJC_BOOL_IS_BOOL 0
    #   else
    #      define OBJC_BOOL_IS_BOOL 1
    #   endif
    #endif
    

    对于 TARGET_OS_OSX || TARGET_OS_IOSMAC || (TARGET_OS_IOS && !__LP64__ && !__ARM_ARCH_7K) 这几种情况,OBJC_BOOL_IS_BOOL为0,那么BOOL类型是signed char,其他情况下BOOL类型等同于bool,而bool是在C99中定义的,其中true为1,false为0。

    这个在开发中有什么用呢

    目前在iOS开发中基本上都是64位的操作系统,所以不会有太大的问题,但是有些情况下会造成错误,比如:

    BOOL value = 10;
    if (value == YES) {
        NSLog(@"BOOL 值 是 1");
    } else {
        NSLog(@"BOOL 值 不是 1");
    }
    

    objc/objc.h类中YES和NO的定义为:

    #if __has_feature(objc_bool)
    #define YES __objc_yes
    #define NO  __objc_no
    #else
    #define YES ((BOOL)1)
    #define NO  ((BOOL)0)
    #endif
    

    所以造成的情况是BOOL类型的变量为YES的时候,值不一定是1,但是YES的定义是1,直接判断==的时候可能返回假,造成无法理解的错误。

    相关文章

      网友评论

          本文标题:Objective-C中的BOOL类型

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