Objective-C:BOOL vs bool

我看到了“新types” BOOLYESNO )。

我读到这种types几乎就像一个字符。

为了testing,我做了:

 NSLog(@"Size of BOOL %d", sizeof(BOOL)); NSLog(@"Size of bool %d", sizeof(bool)); 

很高兴看到两个日志都显示“1”(有时在C ++中,bool是一个int,sizeof是4)

所以我只是想知道是否有问题的布尔types或什么?

我可以使用布尔(似乎工作)不失速度?

objc.h的定义:

 #if (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH typedef bool BOOL; #else typedef signed char BOOL; // BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" // even if -funsigned-char is used. #endif #define YES ((BOOL)1) #define NO ((BOOL)0) 

所以,是的,你可以认为BOOL是一个字符。 您可以使用(C99) booltypes,但所有Apple的Objective-C框架和大多数Objective-C / Cocoa代码都使用BOOL,所以如果typedef只是使用BOOL更改,那么您就可以节省自己的头痛。

如上所述,BOOL是一个有符号的字符。 bool – 从C99标准(int)types。

布尔 – 是/否 布尔 – 真/假。

看例子:

 bool b1 = 2; if (b1) printf("REAL b1 \n"); if (b1 != true) printf("NOT REAL b1 \n"); BOOL b2 = 2; if (b2) printf("REAL b2 \n"); if (b2 != YES) printf("NOT REAL b2 \n"); 

结果是

REAL b1
REAL b2
不是真的b2

请注意,bool!= BOOL。 以下结果只是一次 – 实际b2

 b2 = b1; if (b2) printf("ONCE AGAIN - REAL b2 \n"); if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n"); 

如果你想将bool转换成BOOL,你应该使用下一个代码

 BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false; 

所以,在我们的情况下:

 BOOL b22 = b1 ? 2 : NO; if (b22) printf("ONCE AGAIN MORE - REAL b22 \n"); if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n"); 

所以,我们现在得到什么? 🙂

您应该使用的Objective-Ctypes是BOOL 。 没有什么像本地布尔数据types,因此要确保代码在所有编译器上编译使用BOOL 。 (这是在苹果框架中定义的。

在写这篇文章的时候是objc.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 

这意味着,在64位iOS设备和WatchOS上BOOLbool完全相同,而在所有其他设备上(OS X,32位iOS),它是有signed char ,甚至不能被编译器标志覆盖-funsigned-char

这也意味着这个示例代码将在不同的平台上以不同的方式运行(我自己testing过):

 int myValue = 256; BOOL myBool = myValue; if (myBool) { printf("i'm 64-bit iOS"); } else { printf("i'm 32-bit iOS"); } 

顺便说一句,从来没有分配的东西像array.count BOOLvariables,因为约0.4%的可能值将是负面的。

Yup,BOOL是一个根据objc.h的signed char的typedef。

不过,我不知道布尔。 这是一个C ++的东西,对吧? 如果它被定义为一个有符号的字符,其中1是YES / true,0是NO / false,那么我想你使用哪一个并不重要。

因为BOOL是Objective-C的一部分,所以为了清晰起见,使用BOOL可能更有意义(其他Objective-C开发人员在看到使用bool时可能会感到困惑)。

bool和BOOL之间的另一个区别是它们不会完全转换为相同types的对象,当您执行键值观察时,或者使用类似于[NSObject valueForKey:]的方法时。

正如大家在这里所说的,BOOL是char。 因此,它被转换为一个NSNumber持有一个字符。 这个对象与从“A”或“\ 0”等常规字符创build的NSNumber无法区分。 你完全失去了你原来有一个BOOL的信息。

但是,bool被转换为CFBoolean,其行为与NSNumber相同,但保留了对象的布尔原点。

我不认为这是BOOL与布尔辩论中的争论,但这可能会让你有一天感到困扰。

一般来说,你应该使用BOOL,因为这是Cocoa / iOS API(在C99和它的本地布尔types之前devise)中随处可见的types。

被接受的答案已被编辑,其解释有些不正确。 代码示例已刷新,但下面的文本保持不变。 你不能假定BOOL现在是一个char,因为它依赖于架构和平台。 因此,如果您在32位平台(例如iPhone 5)上运行代码并打印@encode(BOOL),则会看到“c”。 它对应于一个字符types 。 但是如果你在iPhone 5s(64位)上运行你的代码,你会看到“B”。 它对应于一个booltypes 。

我在这里违背惯例。 我不喜欢typedef的基础types。 我认为这是一种无用的间接方式,可以消除价值。

  1. 当我看到源代码中的基本types时,我会立即明白它的意思。 如果这是一个typedef,我必须查看它,看看我真正处理的是什么。
  2. 当移植到另一个编译器或添加另一个库时,它们的typedefs集合可能会冲突并导致难以debugging的问题。 事实上,我已经完成了处理。 在一个库中,boolean被定义为int,在mingw / gcc中被定义为char。