Objective-C中的BOOL类型

以前认为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类型)