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
现在大多数设备和模拟器都是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