为什么BOOL在Objective-C中键入char?

Llu*_*uís 1 boolean objective-c ios

有人告诉我,Objective-C中的BOOL是unsigned char的typedef,YES&NO关键字是编码字符.这不是我第一次听到它.我已经看过这是因为Apple在C标准之前使用BOOL提供了一个_Bool类型,我错了吗?这个事实有什么好处吗?我们在浪费一些记忆吗?这是否提供了在函数中返回有价值数据的方法?在发生某些意外行为时,将它用作返回不同值的方法是否正确?

BOOL myFunction(int argument)
{
    BOOL result = YES; //The function generates the result
    if (someError == YES) {
        return 5;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

我们在浪费一些记忆吗?

不,因为你不能得到一个小于a的变量char:它总是一个字节.您可以在一个单词中打包表示布尔标志的多个位,但您必须手动执行 - 使用位移位,使用位字段等.

这是否提供了在函数中返回有价值数据的方法?

不是真的:你所做的是一个hack,虽然5肯定会通过系统进入调用者,并且会被解释为YES"普通" if语句,例如

if (myFunction(123)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,如果像这样使用它会失败:

if (myFunction(123) == YES) { // 5 != YES
    ...
}
Run Code Online (Sandbox Code Playgroud)

在发生某些意外行为时,将它用作返回不同值的方法是否正确?

从可读性的角度来看总是不正确的; 就"做你想做的事"而言,你的里程可能会有所不同,具体取决于你的功能使用方式.