有人告诉我,Objective-C中的BOOL是unsigned char的typedef,YES&没有关键字是编码字符。这不是我第一次听到它。我已经看过这是因为Apple在C标准之前使用BOOL提供了一个_Bool类型,我错了吗?这个事实有什么好处吗?我们在浪费一些记忆吗?这是否提供了在函数中返回有价值数据的方法?使用它作为在发生某些意外行为时返回不同值的方法是否正确?
BOOL myFunction(int argument)
{
BOOL result = YES; //The function generates the result
if (someError == YES) {
return 5;
}
return result;
}
答案 0 :(得分:5)
我们是在浪费内存吗?
不,因为你不能得到一个小于char
的变量:它总是一个字节。您可以在一个单词中打包表示布尔标志的多个位,但您必须手动执行 - 使用位移位,使用位字段等等。
这是否提供了在函数中返回有价值数据的方法?
不是真的:你所做的是一个黑客,虽然5
肯定会通过系统进入调用者,并且在“普通”{{1}中被解释为YES
声明,例如
if
然而,如果像这样使用它会失败:
if (myFunction(123)) {
...
}
使用它作为在发生某些意外行为时返回不同值的方法是否正确?
从可读性的角度来看总是不正确的;至于“做你想做的事”,你的里程可能会有所不同,具体取决于你的功能使用方式。
答案 1 :(得分:1)
有一个小优势:在许多平台(包括iOS,IIRC)上sizeof(_Bool) == sizeof(int)
,所以使用char
可以稍微紧凑。
除了BOOL
实际上是signed char
,而不是char
,所以@encode(BOOL)
评估所有平台上的同一事物。这会使位域稍微复杂化,因为BOOL foo:1;
似乎定义了1位有符号整数(IIRC,其行为未定义) - 显然unsigned char
是更好的选择,但可能为时已晚。 / p>
_Bool
也应该更好地优化,因为编译器可以对所使用的位模式做出假设,例如将a&&b
替换为a&b
(提供b
是无副作用的)。一些架构在所有位设置时也表示“真实”,这对于屏蔽很有用(想到SSE比较指令)。
答案 2 :(得分:0)
" BOOL不是无符号的char,它是Objective-C库定义它的任何东西。哪个是unsigned char或bool,具体取决于您的编译器设置(32位或64位)。两者都表现不同。使用32位编译器和64位编译器尝试此代码:
BOOL b = 256;
if (b) NSLog (@"b is true"); else NSLog (@"b is false");