Objective-C: BOOL vs bool 在Objective-C中,我们有两种不同的布尔类型:`BOOL`和`bool`。这两种类型都用于表示逻辑真假值。但是它们在一些方面上略有不同。 `BOOL`是Objective-C中最常用的布尔类型。它实际上是一个用于表示真假值的整数类型,可以有两个值:`YES`和`NO`。在使用`BOOL`类型时,我们通常会使用`YES`表示真,`NO`表示假。 `bool`是C语言中的布尔类型,在Objective-C中也可以使用。它是一个更简单的布尔类型,
Objective-C: BOOL vs bool 在Objective-C中,我们有两种不同的布尔类型:`BOOL`和`bool`。这两种类型都用于表示逻辑真假值。但是它们在一些方面上略有不同。 `BOOL`是Objective-C中最常用的布尔类型。它实际上是一个用于表示真假值的整数类型,可以有两个值:`YES`和`NO`。在使用`BOOL`类型时,我们通常会使用`YES`表示真,`NO`表示假。 `bool`是C语言中的布尔类型,在Objective-C中也可以使用。它是一个更简单的布尔类型,
我看到了"new type" BOOL
(YES
, NO
)。
我读到这个类型几乎像是一个char。
为了测试,我做了以下操作:
NSLog(@"BOOL的大小为 %d", sizeof(BOOL)); NSLog(@"bool的大小为 %d", sizeof(bool));
很高兴看到两个日志都显示为"1"(有时在C++中bool是一个int,其大小为4)
所以我想知道bool类型是否存在一些问题或者其他什么吗?
我能只使用bool(似乎可以工作)而不会丧失速度吗?
在Objective-C中,我们经常会使用BOOL来表示布尔值。但是,根据不同的平台和设备,BOOL的实际类型可能有所不同。具体来说,在64位iOS设备和WatchOS上,BOOL和bool是相同的类型,而在其他设备上(如OS X和32位iOS),BOOL是signed char类型,并且即使使用了编译器标志-funsigned-char也无法改变。
这就意味着同样的代码在不同的平台上可能会有不同的运行结果。举个例子,考虑以下代码:
int myValue = 256; BOOL myBool = myValue; if (myBool) { printf("我是64位iOS"); } else { printf("我是32位iOS"); }
在64位iOS设备上,myBool将被赋值为true,因此输出将是"我是64位iOS"。而在32位iOS设备上,myBool将被赋值为false,因此输出将是"我是32位iOS"。
另外需要注意的是,不要将类似array.count这样的值赋给BOOL变量,因为大约0.4%的可能值会是负数。
此外,如果你在编译32位iOS设备上的代码时,将bool作为一个接受BOOL参数的block的参数(例如UIView动画),编译器会报错。因此,在我的代码中,我在所有地方都使用C++的bool类型,而在定义了BOOL参数的API中使用BOOL类型。
,这个问题的出现是因为Objective-C中的BOOL类型在不同的平台和设备上可能有不同的实际类型。为了解决这个问题,我们需要根据具体的情况来选择使用BOOL还是bool,并避免将可能是负数的值赋给BOOL变量。
在Objective-C中,存在着BOOL和bool两种类型。BOOL是一个有符号的char类型,而bool是C99标准中的一种整数类型。它们分别代表着YES/NO和true/false。
下面是一些示例代码:
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是不同的。下面的结果只打印了一次"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`。在我的iPhone SE模拟器上,并没有打印出"NOT REAL b2"。
Objective-C中的BOOL和bool之间的区别和问题出现的原因以及解决方法是什么?
从上面的代码中可以看出,BOOL在64位系统上被定义为bool类型,而在其他系统上被定义为有符号的char类型。这样做是为了确保BOOL的取值范围始终是1和0,而不会有其他非零值。同时,定义了YES为(BOOL)1,NO为(BOOL)0。
虽然C99的bool类型也可以被使用,但是苹果的Objective-C框架和大部分Objective-C/Cocoa代码都使用了BOOL类型。因此,建议在代码中使用BOOL类型,这样如果typedef发生变化,可以避免麻烦。
虽然大部分的Objective-C框架都使用了BOOL类型,但是也有一些C语言的框架(如CoreFoundation和CoreGraphics等)使用了C99的bool类型。
此外,有一个开发者在使用BOOL类型时遇到了一个问题。他发现当将(progressTime>=totalTime)赋值给BOOL类型的变量success时,始终返回NO。但是当将该表达式的值赋值给bool类型的变量success时,返回了正确的结果。他不明白为什么会出现这种行为。
根据这些信息,我们可以得出以下结论:
- BOOL类型在不同系统中的定义有所不同,因此在不同的系统上可能会有不同的行为。
- 使用BOOL类型可以确保取值范围只有1和0,避免了其他非零值的问题。
- 大部分的Objective-C框架都使用了BOOL类型,因此建议在代码中使用BOOL类型。
- 一些C语言的框架使用了C99的bool类型。
- 在某些情况下,BOOL类型可能会出现不符合预期的行为,可能需要使用bool类型或其他方式来解决。
希望以上内容对您有所帮助。