bool 与BOOL

Objective-C 语言是在C 语言的基础上,又加了一层实例导向与动态语言特性的语言,很多基本类型是直接来自于C 语言。C 语言在发展之初,并没有布尔值,于是Objective-C 语言在发展的过程中,定义了自己的BOOL,但是在C99 规格中,C 语言又有了自己的布尔类型bool,而Objective-C 又可以混和C++ 语法变成Objective-C++,C++ 里头也有bool。

那么,Objective-C 的BOOL,与C99 以及C++ 的bool 有什么差别呢?我们来看里头的定义,这是iOS 9 SDK 的版本:

#include <stdbool.h>

....

/// Type to represent a boolean value.
#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH
#define OBJC_BOOL_IS_BOOL 1
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

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

也就是说,在iOS 的64 位元或是在Apple Watch 上,Objective-C 的BOOL 会直接等于定义在stdbool.h 里头的bool,其实是int,而如果使用了C++,那么stdbool.h 里头的定义就变成是C++ 的bool。但,如果是在Mac OS X 上,或是32 位的iOS 环境下,BOOL 就会被定义成是一个char,而BOOL 与bool,就分别是一个byte 或是四个bytes 的差别。

所以,在64 位或Apple Watch 上,BOOL 与bool 并没有差别,但我们通常不能假设我们写的code 只会在这种环境下执行,虽然在其他环境下,使用BOOL 或是bool 通常也没什么影响,但既然某个API 明确就是要求你传入BOOL,那就传入YES 或NO,好像也没什么非要传入true 或false 的理由。

另外,当我们想把BOOL转成NSNumber,最简单的写法还是直接使用Xcode 4.4之后的literals的写法,写成@(YES)@(NO),另外Core Foundation里头也定义了kCFBooleanTrue与kCFBooleanFalse,也具有同样的功能。

results matching ""

    No results matching ""