Так как C99, C теперь имеет собственный булев тип, _Bool. Objective-C, как строгий надмножество C, наследует это, но когда он был создан еще в 1980-х годах, не было C-типа Boolean, поэтому Objective-C определено BOOL как signed char.
Все Cocoa использует BOOL, как и весь код не-NeXT/Apple Cocoa, который я видел. Очевидно, что для совместимости с существующими протоколами (например, -applicationShouldTerminateAfterLastWindowClosed: от NSApplicationDelegate) предпочтительным является сопоставление уже заявленного типа, если только для предотвращения предупреждения.
Для целей чистоты/удобочитаемости stdbool.h определяет BOOL как синоним _Bool, поэтому те из нас, кто не хочет лишних подчеркиваний в нашем коде, могут использовать это.
Три других полезных примечания:
-
@encode(_Bool)оценивается как"B". (@encode(BOOL)оценивается до"c", дляsigned char.) -
sizeof(_Bool)оценивается как1, что следует из определения C99, что_Boolявляется настолько большим, насколько необходимо для хранения двух возможных значений. ( Изменить: На самом деле, стандарт говорит только о том, что он должен быть "достаточно большим", чтобы удерживать эти два значения, он не устанавливает верхнюю границу и, по сути, Mac OS X на 32-битной PowerPC определяет ее как 4 байта. Разница в размерах - это еще одна вещь, которая может быть связана с возможными проблемами совместимостиBOOL-vs.-BOOL.) - В этом примечании единственными двумя возможными значениями a
_Boolявляются 1 и 0. Любые другие значения преобразуются в одно из них при назначении, как если бы вы делали двойное отрицание (!!) или тестировали неравенство против 0 (!= 0). Единственные способы получить_Boolс некоторым другим значением - это обычные магии: наложение псевдонимов и союзы.
Есть ли причина не использовать _Bool/BOOL в новом коде?