我看到了"新型" 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(看似有效)吗?
从定义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,您将免于头痛.
如上所述,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");
那么......我们现在得到了什么?:-)
在撰写本文时,这是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%的可能值将是负数.
你应该使用的Objective-C类型是BOOL
.没有什么比本机布尔数据类型更好,因此要确保代码编译在所有编译器上使用BOOL
.(它在Apple-Frameworks中定义.
根据objc.h,Yup,BOOL是签名字符的typedef.
不过我不知道bool.这是C++的事情,对吧?如果它被定义为一个有符号的字符,其中1是YES/true而0是NO/false,那么我想你使用哪一个并不重要.
但是,由于BOOL是Objective-C的一部分,因此为了清晰起见使用BOOL可能更有意义(如果他们看到使用bool,其他Objective-C开发人员可能会感到困惑).