Objective-c中的BOOL

objc.h 源码中对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__则是由预处理器定义的宏,代表当前操作系统是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

现在大多数设备和模拟器都是64位的指令集,所以使用BOOL值没有问题,但是在32位指令集,定义BOOL值是一个一字节的char型,这就导致在32位指令集BOOL bValue = 8960;只取到前8位,也就是0,所以bValue在32位系统是NO值。
为了验证,我找来哥们的iPod touch4,确实如此,而在非32位的机器上都没有问题。
另外总结一下,

1、i386 x86_64都是mac指令集,i386的模拟器是32位, x86_64模拟器为64位
2、苹果A7处理器之后都64位,以前处理器是32位。
3、iPhone5S和ipad air之后的机型都是64位,以前的版本都是32位的老机型。

以前的解释:https://blog.csdn.net/jiajiayouba/article/details/40824339
oc源码:https://opensource.apple.com/source/objc4/objc4-723/runtime/objc.h.auto.html
关于指令集位数:
https://www.jianshu.com/p/d976c0f2e430
https://www.jianshu.com/p/f0c0c56e72f6
写完发现有一篇文章已经详尽的讲过了:
https://hk.saowen.com/a/18196a39095d210ebcfd888e983984664f13b2e07c496e191e306e67def1c9ae

你可能感兴趣的:(Objective-c中的BOOL)