以前認(rèn)為OC
中的BOOL
類型和其他基本類型一樣车要,都是預(yù)設(shè)好的關(guān)鍵字,今天看runtime
源碼的時(shí)候才發(fā)現(xiàn)不是這樣的,看來(lái)以后還是要多深入底層看看。
在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
對(duì)于 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。
這個(gè)在開(kāi)發(fā)中有什么用呢捎废?
目前在iOS開(kāi)發(fā)中基本上都是64位的操作系統(tǒng)笑窜,所以不會(huì)有太大的問(wèn)題,但是有些情況下會(huì)造成錯(cuò)誤登疗,比如:
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
的時(shí)候排截,值不一定是1,但是YES
的定義是1辐益,直接判斷==
的時(shí)候可能返回假断傲,造成無(wú)法理解的錯(cuò)誤。