Objective-C中的BOOL實際上是一種對帶符號的字符類型(signed char)的類型定義(typedef) 它使用8位的儲存空間。通過#define指令把YES定義為1,NO定義為0.
Objective-C并不會把BOOL作為僅能保存YES或NO值得真正布爾類型來處理憔足。編譯器仍將BOOL認作8位二進制數(shù)厉颤,YES和NO值只是習慣上的一個理解臀脏。這樣會引發(fā)一個小問題:如果不小心將一個大于一字節(jié)的整型值(比如short或int)賦給一個BOOL變量铺峭,那么只有低位字節(jié)會用作BOOL值。如果該低位字節(jié)剛好為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.