Objective-C中的BOOL实际上是一种对带符号的字符类型(signed char)的类型定义(typedef) 它使用8位的储存空间。通过#define指令把YES定义为1,NO定义为0.
Objective-C并不会把BOOL作为仅能保存YES或NO值得真正布尔类型来处理。编译器仍将BOOL认作8位二进制数,YES和NO值只是习惯上的一个理解。这样会引发一个小问题:如果不小心将一个大于一字节的整型值(比如short或int)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。如果该低位字节刚好为0(比方说8960,写成16进制为0x2300),BOOL值会被认作是0,即NO值。
不要将BOOL值和YES直接作比较。因为虽然大于0的值在c语言判断为真值,但是在Objective-C中它不等于YES(YES的值以整型表示为1)。
BOOL a = YES;
if (a == YES){};(错误)if (a) {};(正确)
相反的BOOL值直接与NO比较一定是安全的,因为NO在C和Objective-C中只有一个值0.