Objective-C : BOOL vs bool Objective-C : BOOL vs bool c c

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.