以前認為OC中的BOOL類型和其他基本類型一樣,都是預(yù)設(shè)好的關(guān)鍵字,今天看runtime源碼的時候才發(fā)現(xiàn)不是這樣的,看來以后還是要多深入底層看看。
在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。
這個在開發(fā)中有什么用呢?
目前在iOS開發(fā)中基本上都是64位的操作系統(tǒng),所以不會有太大的問題,但是有些情況下會造成錯誤,比如:
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,直接判斷==的時候可能返回假,造成無法理解的錯誤。