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

Fro*_*ost 30 boolean objective-c ios

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

bool,Boolean和BOOL有什么区别?

Jon*_*ier 48

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

  • 在CoreFoundation中使用`Boolean`(Carbon主要建立在此之上),所以虽然你应该在objective-C中使用BOOL,但在处理任何CoreFoundation API时,布尔仍在使用中. (6认同)
  • 如果`stdbool.h`包含在C99中,那么`bool`是一个扩展为`_Bool`的宏,它是一个内置的真正的布尔类型,表示0或1,它不是`int`. (4认同)
  • 如今,除了与使用旧类型之一的现有 API 进行互操作之外,应该始终使用“bool”(如果不是使用 [Objective] C++ 编码,则包括“stdbool.h”)。使用真正的布尔类型(只能取值 0 和 1,任何非零整数都会自动转换为“true”)会消除一整类可能的错误。 (2认同)

ric*_*ter 9

我不想从@JonShier 的有用答案中删除,但我要添加的内容比评论中的内容要多...

bool

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

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

Boolean

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

不要用这个。

BOOL

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

ObjCBOOL通常被定义为typedef signed char,这意味着它可以容纳更多的值,而不仅仅是YES(1) 和NO(0)。如果您不小心,那可能是个问题。(为什么要这样做?因为如果一个类型有点宽,就很难将其装入对齐良好的内存以获得良好的性能。)

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

TLDR

如果您在 ObjC 中使用 ObjC 框架(如 Cocoa、UIKit 等),您应该使用BOOL与您正在交互的 API 保持一致。(此外,YESandNOtrueand响亮得多false,当你谈论绝对真理时,强调是好的,对吧?)