Objective-C中的BOOL類型

以前認為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,直接判斷==的時候可能返回假,造成無法理解的錯誤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容