Objective-C : BOOL vs bool
From the definition in objc.h
:
#if (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCHtypedef bool BOOL;#elsetypedef 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)
So, yes, you can assume that BOOL is a char. You can use the (C99) bool
type, but all of Apple's Objective-C frameworks and most Objective-C/Cocoa code uses BOOL, so you'll save yourself headache if the typedef ever changes by just using BOOL.
As mentioned above, BOOL is a signed char. bool - type from C99 standard (int).
BOOL - YES/NO. bool - true/false.
See examples:
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");
And result is
REAL b1
REAL b2
NOT REAL b2
Note that bool != BOOL. Result below is only ONCE AGAIN - REAL b2
b2 = b1;if (b2) printf("ONCE AGAIN - REAL b2 \n");if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n");
If you want to convert bool to BOOL you should use next code
BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false;
So, in our case:
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");
And so.. what we get now? :-)
At the time of writing this is the most recent version of objc.h:
/// Type to represent a boolean value.#if (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH#define OBJC_BOOL_IS_BOOL 1typedef bool BOOL;#else#define OBJC_BOOL_IS_CHAR 1typedef signed char BOOL; // BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" // even if -funsigned-char is used.#endif
It means that on 64-bit iOS devices and on WatchOS BOOL
is exactly the same thing as bool
while on all other devices (OS X, 32-bit iOS) it is signed char
and cannot even be overridden by compiler flag -funsigned-char
It also means that this example code will run differently on different platforms (tested it myself):
int myValue = 256;BOOL myBool = myValue;if (myBool) { printf("i'm 64-bit iOS");} else { printf("i'm 32-bit iOS");}
BTW never assign things like array.count
to BOOL
variable because about 0.4% of possible values will be negative.