Objective-C中的bool,Boolean和BOOL有什么区别吗?
我知道BOOL实际上是一个带有signed char的typedef,但布尔值呢?
bool,Boolean和BOOL有什么区别?
Boolean
是旧的Carbon关键字(历史Mac类型),定义为unsigned char
。 BOOL
是一种定义为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保持一致。 (此外, YES
和NO
比true
更响亮,当你谈论绝对真理时强调是对的,对吧?)
如果您的新API不需要与旧API进行交互,那么bool
比BOOL更具体和清晰。
使用Xcode 9构建非Mac应用程序时, BOOL v = 2; NSLog(@"%d", v);
BOOL v = 2; NSLog(@"%d", v);
输出“1”,而不是“2”。
参考Apple文档
- 使用Carthage更快地在Xcode中构建。
- 是否有可能提取在web视图中加载的URL的源代码?
- FBSDKAccessToken currentAccessToken没有收到电子邮件ID?
- 如何使用XCode在iOS中的媒体播放器应用程序中创建一个现在正在播放的栏?
- 无法通过谷歌在iOS应用程序中正确投射video
- UIImagePickerController在缩放时显示黑条 – 这是iOS中的错误吗?
- 以编程方式创建对象并更改该对象的位置
- 使用scrollViewWillEndDragging自定义UIScrollView分页
- 在UIViewController中添加UINavigationController