Mikael Konutgan


I recently bought the NSHipster book and was rereading BOOL / bool / Boolean / NSCFBoolean and noticed the part where Mattt explains how comparing with YES can be dangerous, because BOOL is a typedef of signed char. I remembered that on 64-bit devices BOOL is actually a typedef of bool, the native (as of C99) boolean type.

The intersting thing is that the native bool type is safe, safe in the sence that a variable typed as bool can only ever have the values 0 or 1. So

BOOL value = 5;
NSLog(@"%d", value);

prints 5 on all iPhone’s except for the iPhone 5s, where it prints 1.

Also e.g. (BOOL)5 is 1 on 64-bit devices, getting rid of the awkward !! pattern to safely cast other types into booleans.

Even so, you probably shouldn’t compare boolean expressions with YES, but at least you will get the expected result on 64-bit devices going forward, as functions or methods returning BOOL will always return 0 or 1.