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
.
我不想从@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 上仍然需要担心它们。)
如果您在 ObjC 中使用 ObjC 框架(如 Cocoa、UIKit 等),您应该使用BOOL
与您正在交互的 API 保持一致。(此外,YES
andNO
比true
and响亮得多false
,当你谈论绝对真理时,强调是好的,对吧?)
归档时间: |
|
查看次数: |
15597 次 |
最近记录: |