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

时间:2010-06-10 17:25:23

标签: ios objective-c boolean

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

bool,Boolean和BOOL有什么区别?

3 个答案:

答案 0 :(得分:45)

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

编辑(2019):Apple在某些new documentation中讨论了BOOL的基础实现。基本上,在macOS上,BOOL仍然最终是signed char,但在iOS和相关平台上,它下面是原生C bool

答案 1 :(得分:3)

我不想忘记@ JonShier的有用答案,但我还要补充一点而不是评论......

bool

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

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

Boolean

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

不要使用它。

BOOL

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

ObjC BOOL通常定义为typedef signed char,这意味着它可以包含的值不仅仅是YES(1)和NO(0)。 That can be a problem if you aren't careful。 (为什么要这样做呢?因为如果一个类型是一位宽,很难打包到良好对齐的内存中以获得良好的性能。)

但是,在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保持一致。 (此外,YESNOtruefalse更响亮,当你谈论绝对真理时强调是对的,对吗?)

答案 2 :(得分:0)

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

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

参考Apple documentation