Objective-C:BOOL vs bool
我看到了“新types” BOOL
( YES
, NO
)。
我读到这种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) bool
types,但所有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上BOOL
与bool
完全相同,而在所有其他设备上(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
BOOL
variables,因为约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。 我认为这是一种无用的间接方式,可以消除价值。
- 当我看到源代码中的基本types时,我会立即明白它的意思。 如果这是一个typedef,我必须查看它,看看我真正处理的是什么。
- 当移植到另一个编译器或添加另一个库时,它们的typedefs集合可能会冲突并导致难以debugging的问题。 事实上,我已经完成了处理。 在一个库中,boolean被定义为int,在mingw / gcc中被定义为char。