Есть ли какая-либо разница между bool, Boolean и BOOL в Objective-C? - PullRequest
28 голосов
/ 10 июня 2010

Я знаю, что BOOL на самом деле является typedef со знаком char, но как насчет Boolean?

В чем разница между bool, Boolean и BOOL?

Ответы [ 3 ]

45 голосов
/ 10 июня 2010

Boolean - это старое ключевое слово Carbon (исторический тип Mac), определяемое как unsigned char. BOOL - это тип Objective C, определенный как signed char. bool является определенной версией _Bool стандартного типа C. Это определяется как int. Используйте BOOL.

Редактировать (2019): Apple рассказывает о базовой реализации BOOL в некоторых новой документации . По сути, в macOS BOOL по-прежнему является signed char, но на iOS и связанных с ним платформах это родной C bool под ним.

3 голосов
/ 27 марта 2018

Я не хочу отказываться от полезного ответа @ JonShier, но я должен добавить больше, чем хорошо вписывается в комментарий ...

bool

Представленостандарт C в спецификации C99.(Стандарт C99 был опубликован в 1999 году, но потребовалось несколько лет после того, как он стал широко распространенным в использовании.) До этого «обычный» C не имел встроенного булева типа, поэтому библиотеки, основанные наВершина C часто определяется своими собственными.(И часто продолжали использовать свои собственные типы для совместимости исходного кода / двоичного кода даже после того, как они приняли компиляторы C99.)

Используйте это, если вы пишете ISO C и не работаете в контексте библиотек более высокого уровня с ихсобственные булевы типы.

Boolean

Определяется Carbon (мост совместимости ранних OSX с еще более старой версией Mac Toolbox), который вы все еще можете увидеть в некоторых проектах (из-за переходного процесса #includeзаголовков, которые действительно только для совместимости с действительно старым исходным кодом).

Не используйте это.

BOOL

Определяется ObjC, поскольку NeXTSTEP нуждался в своем собственном логическом типе еще в 1988 году. (Самый старый objc.h, который я могу найтина моей офисной книжной полке датируется 1992 годом и содержит определение BOOL.)

ObjC BOOL часто определяется как typedef signed char, что означает, что он может содержать больше значений, чем просто YES (1) и NO (0). Это может быть проблемой, если вы не будете осторожны .(Зачем даже это делать? Потому что если тип имеет один бит ширины, его трудно упаковать в хорошо выровненную память для хорошей производительности.)

Однако в iOS 64-битной (включая tvOS) и watchOS,Компилятор определяет OBJC_BOOL_IS_BOOL, что делает ObjC BOOL просто псевдонимом для C99 bool.Это означает, что язык / компилятор гарантирует, что ненулевые значения всегда сохраняются как 1, поэтому у вас нет проблем, связанных с typedef signed char BOOL.(Тем не менее, по-прежнему нужно беспокоиться о них на macOS или 32-битной iOS.)

TLDR

Если вы работаете в ObjC с инфраструктурами ObjC (такими как Cocoa, UIKit и т. Д.), Выследует использовать BOOL для согласованности с API, с которыми вы взаимодействуете.(Кроме того, YES и NO намного громче, чем true и false, и хорошо, когда вы говорите об абсолютной истине, нужно быть решительным, верно?)

0 голосов
/ 19 июня 2018

Если вашим новым API не нужно взаимодействовать со старыми, bool более конкретен и понятен, чем BOOL.

При создании приложения не для Mac с Xcode 9 BOOL v = 2; NSLog(@"%d", v); выводит «1», а не «2».

Ссылка на Документация Apple

...