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

37

我知道BOOL实际上是signed char的一个typedef,但是Boolean又是什么呢?

bool、Boolean和BOOL之间有什么区别?


Objective-C 中没有叫做 "Boolean" 或者 "bool" 的类型,你能否澄清一下你的问题? - Carl Norum
我不知道,Boolean 出现在 CF 库中... - Frost
当然可以。它是C,所以也有那些功能。还有C ++的一些东西。 - uchuugaka
3个回答

54

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

编辑(2019年):苹果在一些新文档中讨论了关于BOOL的底层实现。 在 macOS 上,BOOL 最终仍然是一个 signed char,但在 iOS 和相关平台上,它是一个本地的C类型bool


6
在CoreFoundation中(Carbon大多数是基于它构建的)使用了Boolean类型,因此在Objective-C中应该使用BOOL,但在处理任何CoreFoundation API时仍然要使用Boolean - bobDevil
1
哦,我明白了,所以我应该在常规使用中使用BOOL,在CF中使用Boolean。谢谢! - Frost
4
如果在 C99 中包含了 stdbool.h,那么 bool 就是一个宏,展开为 _Bool,它是一个内置的真布尔类型,代表 0 或 1,而不是一个 int - dreamlax
1
现在,除了与使用旧类型的现有 API 进行交互之外,程序员应始终使用 bool(包括在非 [Objective] C++ 编程时使用 stdbool.h)。使用真正的布尔类型(只能采用值 0 和 1,任何非零整数都会自动转换为 true)可以消除整个可能的错误类。 - zwol
似乎在arm64的macOS(Apple Silicon)上,BOOL也是C99 bool。因此,这可能更多地与芯片架构有关,而与操作系统无关?这里有一个指向GH问题调查的链接:https://github.com/SSheldon/rust-objc/issues/110 - schellsan
显示剩余4条评论

9

我不想削弱@JonShier有用的回答,但是我有更多要补充的内容,而这些内容在评论中不太合适...

bool

在C99规范中引入。 (C99标准于1999年“发布”,但在那之后还需要一些年才能广泛使用。)在此之前,“普通” C 没有内置的布尔类型,因此构建在 C 之上的库经常定义自己的类型。(即使在采用了 C99 编译器之后,它们通常仍然使用自己的类型来实现源/二进制兼容性。)

如果您正在编写 ISO C 并且没有在高级库的上下文中工作,则可以使用此选项。

Boolean

由Carbon(早期 OSX 版本的兼容性桥接层,用于与更旧的 Mac Toolbox 兼容)定义,您可能仍会在某些项目中看到它(由于传递性地包含头文件,这些头文件仅用于与真正的旧源代码兼容)。

请勿使用此选项。

BOOL

ObjC因为NeXTSTEP需要自己的布尔类型而定义了BOOL,这发生在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上仍需注意。)

简述

如果你在使用ObjC框架(如Cocoa、UIKit等)进行编程,应该使用BOOL以保持与你所交互的API的一致性。(此外,YESNOtruefalse更加突出,当你谈论绝对真理时,强调是很好的,不是吗?)


-1
如果您的新API不需要与旧API交互,那么使用bool比使用BOOL更具体和清晰。
在使用Xcode 9构建非Mac应用程序时,BOOL v = 2; NSLog(@"%d", v);输出的是"1"而不是"2"。
参考Apple文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接