Objective-C中的BOOL类型
2019-02-19 本文已影响10人
kim_xx
以前认为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,直接判断==
的时候可能返回假,造成无法理解的错误。