Objective-C中的布尔类型之间有什么区别?

时间:2019-02-14 17:18:19

标签: objective-c

我尝试在它们之间交换布尔类型,并且它起作用了。但是CFBooleanRef发出了警告。 毕竟它们之间有什么区别?

boolean_t a = true;
bool b = a;
Boolean c = b;
BOOL d = c;
CSSM_BOOL e = d;
_Bool f = e;
CGPDFBoolean g = f;
CFBooleanRef h = g;

1 个答案:

答案 0 :(得分:4)

BOOL with 64-bit on iOS可以回答大多数问题(我很想将其重复使用,但是这里没有涉及其他几点)。

这个问题的90%由“历史”回答。 C中的布尔值定义为某种整数。那是什么8位?字大小?签?未签名?它们都有些不同,并且多年来,许多框架和系统都定义了自己的规范“布尔”类型。

boolean_t来自Mach内核。 boolstdbool.h(即C标准库)中定义,并且引用在C99中定义的_Bool类型。

Boolean是旧的Carbon类型。 CSSM_BOOL来自CDSA安全框架。 CGPDFBoolean是一种核心图形类型。

BOOL是Objective-C的一部分(这里的所有其他内容实际上都是C)。有点不同,因为从技术上讲,它的值是YESNO。但这实际上与其他实践相同。

这里唯一真正突出的是CFBoolRef,这是完全不同的事情。它是对NSNumber对象的引用。它与其他人确实不兼容。

但是潜在的问题是,在C的早期(头30年),没有用于“ true or false”的标准类型,因此创建了很多很多,其中有些非常轻微不同。随着时间的流逝,它们中的许多已经变得用其他术语来定义(例如,BOOL现在通常但不总是定义为bool)。但是他们都有自己的历史,因为没有标准。

Obligatory XKCD

此时您可能会问,谁在乎布尔值有多大? x = (int)1x = (unsigned long)1在C语言中做不完全一样的事情吗?是的他们是这样。没关系直到....想象您传递一个指向通过引用更新的布尔值的指针(例如,[NSFileManager fileExistsAtPath:isDirectory:]执行此操作)。那么大小非常非常重要。我在一个项目中遇到了这个问题,其中有人用C编译时将BOOL定义为unsigned char,而使用C ++编译时将bool定义为BOOL。因此,如果true == !false位于标头中,则包含该标头的C和C ++会期望得到不同大小的结果。哦,那里的错误很棒。...onChange失败时,很难调试。