当前位置:  开发笔记 > IOS > 正文

Objective-C:BOOL vs bool

如何解决《Objective-C:BOOLvsbool》经验,为你挑选了5个好方法。

我看到了"新型" BOOL(YES,NO).

我读到这种类型几乎就像一个字母.

为了测试,我做了:

NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));

很高兴看到两个日志显示"1"(有时在C++中bool是一个int,其sizeof是4)

所以我只是想知道bool类型是否存在某些问题?

我可以在不失速度的情况下使用bool(看似有效)吗?



1> Barry Wark..:

从定义objc.h:

#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH
typedef bool BOOL;
#else
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif

#define YES ((BOOL)1)
#define NO  ((BOOL)0)

所以,是的,你可以假设BOOL是一个char.您可以使用(C99)bool类型,但Apple的所有Objective-C框架和大多数Objective-C/Cocoa代码都使用BOOL,因此如果仅使用BOOL更改typedef,您将免于头痛.


@Elliot你是对的.许多C框架(CoreFoundation,CoreGraphics等)使用C99`bool`.所有Objective-C框架都使用`BOOL`.
"所有Apple的框架" - 不是真的.看看CGGeometry.h,具体来说:CG_INLINE bool __CGPointEqualToPoint(CGPoint point1,CGPoint point2){return point1.x == point2.x && point1.y == point2.y; }

2> beryllium..:

如上所述,BOOL是一个签名字符.bool - 来自C99标准(int)的类型.

BOOL - 是/否.bool - 真/假.

见例子:

bool b1 = 2;
if (b1) printf("REAL b1 \n");
if (b1 != true) printf("NOT REAL b1 \n");

BOOL b2 = 2;
if (b2) printf("REAL b2 \n");
if (b2 != YES) printf("NOT REAL b2 \n");

结果是

REAL b1
REAL b2
NOT REAL b2

注意bool!= BOOL.以下结果仅为ONCE AGAIN - REAL b2

b2 = b1;
if (b2) printf("ONCE AGAIN - REAL b2 \n");
if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n");

如果你想将bool转换为BOOL,你应该使用下一个代码

BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false;

所以,在我们的案例中:

BOOL b22 = b1 ? 2 : NO;
if (b22)    printf("ONCE AGAIN MORE - REAL b22 \n");
if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n");

那么......我们现在得到了什么?:-)


你可以,而不是使用三元运算符使用`!! b1`.要在它们之间进行转换

3> Tobol..:

在撰写本文时,这是objc.h的最新版本:

/// Type to represent a boolean value.
#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH
#define OBJC_BOOL_IS_BOOL 1
typedef bool BOOL;
#else
#define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif

这意味着在64位iOS设备和WatchOS BOOL上完全相同,bool而在所有其他设备(OS X,32位iOS)上,它signed char甚至无法被编译器标志覆盖-funsigned-char

它还意味着此示例代码将在不同平台上以不同方式运行(我自己测试):

int myValue = 256;
BOOL myBool = myValue;
if (myBool) {
    printf("i'm 64-bit iOS");
} else {
    printf("i'm 32-bit iOS");
}

BTW永远不会分配类似变量的东西array.count,BOOL因为大约0.4%的可能值将是负数.



4> Georg Schöll..:

你应该使用的Objective-C类型是BOOL.没有什么比本机布尔数据类型更好,因此要确保代码编译在所有编译器上使用BOOL.(它在Apple-Frameworks中定义.


这不是严格准确的.`BOOL`由Objective-C语言定义(它位于`objc/*.h`标题之一),而不是框架.此外,在使用C99(我认为是默认值)进行编译时,还有一个本机布尔类型`_Bool`(如果包含`stdbool.h`则为`bool`).

5> Jeff..:

根据objc.h,Yup,BOOL是签名字符的typedef.

不过我不知道bool.这是C++的事情,对吧?如果它被定义为一个有符号的字符,其中1是YES/true而0是NO/false,那么我想你使用哪一个并不重要.

但是,由于BOOL是Objective-C的一部分,因此为了清晰起见使用BOOL可能更有意义(如果他们看到使用bool,其他Objective-C开发人员可能会感到困惑).


_Bool在C99中定义,在标准头文件stdbool.h中,定义宏bool(扩展为_Bool),并在此定义true/false.
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有