Objective-C中的bool,Boolean和BOOL有什么区别吗?

我知道BOOL实际上是一个带有signed char的typedef,但布尔值呢?

bool,Boolean和BOOL有什么区别?

Boolean是旧的Carbon关键字(历史Mac类型),定义为unsigned charBOOL是一种定义为signed char的Objective-C类型。 bool_Bool标准C类型的定义版本。 它被定义为一个int 。 使用BOOL

我不想带走@ JonShier的有用答案,但我还要补充一点,而不是在评论中说得好…

bool

在C99规范中引入标准C。 (C99标准发布于1999年,但在此之后花了几年才广泛使用。)在此之前,“普通”C没有内置的布尔类型,因此构建在C之上的库经常定义它们的拥有。 (并且即使在他们接受C99编译器之后,也经常继续使用他们自己的类型来获得源/二进制兼容性。)

如果您正在编写ISO C并且不在具有自己的布尔类型的更高级库的上下文中工作,请使用此选项。

Boolean

由Carbon定义(早期的OSX-days兼容性桥接器,甚至更旧的Mac工具箱),您可能仍会在某些项目中看到这些桥接器(由于传递的#include of headers实际上只是为了与旧的源代码兼容)。

不要用这个。

BOOL

由ObjC定义,因为NeXTSTEP在1988年需要它自己的布尔类型。(我在办公室书架上找到的最早的objc.h可以追溯到1992年,包括BOOL的定义。)

ObjC BOOL经常被定义为typedef signed char ,这意味着它可以包含比YES (1)和NO (0)更多的值。 如果你不小心,这可能是一个问题 。 (为什么要这样做呢?因为如果类型是一位宽,那么很难将其打包到良好对齐的内存中以获得良好的性能。)

但是,在iOS 64位(包括tvOS)和watchOS中,编译器定义了OBJC_BOOL_IS_BOOL ,这使得ObjC BOOL只是C99 bool的别名。 这意味着语言/编译器确保非零值始终存储为1,因此您不会遇到来自typedef signed char BOOL 。 (但仍然需要在macOS或32位iOS上担心它们。)

TLDR

如果您使用ObjC框架(如Cocoa,UIKit等)在ObjC中工作,则应使用BOOL与您正在交互的API保持一致。 (此外, YESNOtrue更响亮,当你谈论绝对真理时强调是对的,对吧?)

如果您的新API不需要与旧API进行交互,那么bool比BOOL更具体和清晰。

使用Xcode 9构建非Mac应用程序时, BOOL v = 2; NSLog(@"%d", v); BOOL v = 2; NSLog(@"%d", v); 输出“1”,而不是“2”。

参考Apple文档