Objective-c中的BOOL

objc.h 源碼中對(duì)BOOL值的定義

/// Type to represent a boolean value.

#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_IOS && !__LP64__ && !__ARM_ARCH_7K)
#      define OBJC_BOOL_IS_BOOL 0
#   else
#      define OBJC_BOOL_IS_BOOL 1
#   endif
#endif
//__LP64__則是由預(yù)處理器定義的宏,代表當(dāng)前操作系統(tǒng)是64位。
#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

#define OBJC_BOOL_DEFINED

#if __has_feature(objc_bool)
#define YES __objc_yes
#define NO  __objc_no
#else
#define YES ((BOOL)1)
#define NO  ((BOOL)0)
#endif
image.png

現(xiàn)在大多數(shù)設(shè)備和模擬器都是64位的指令集,所以使用BOOL值沒有問題,但是在32位指令集,定義BOOL值是一個(gè)一字節(jié)的char型,這就導(dǎo)致在32位指令集BOOL bValue = 8960;只取到前8位,也就是0,所以bValue在32位系統(tǒng)是NO值。
為了驗(yàn)證,我找來哥們的iPod touch4,確實(shí)如此,而在非32位的機(jī)器上都沒有問題。
另外總結(jié)一下,

1、i386 x86_64都是mac指令集,i386的模擬器是32位, x86_64模擬器為64位
2、蘋果A7處理器之后都64位,以前處理器是32位。
3、iPhone5S和ipad air之后的機(jī)型都是64位,以前的版本都是32位的老機(jī)型。

以前的解釋:https://blog.csdn.net/jiajiayouba/article/details/40824339
oc源碼:https://opensource.apple.com/source/objc4/objc4-723/runtime/objc.h.auto.html
關(guān)于指令集位數(shù):
http://www.itdecent.cn/p/d976c0f2e430
http://www.itdecent.cn/p/f0c0c56e72f6
寫完發(fā)現(xiàn)有一篇文章已經(jīng)詳盡的講過了:
https://hk.saowen.com/a/18196a39095d210ebcfd888e983984664f13b2e07c496e191e306e67def1c9ae

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

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

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