Я видел "новый тип" BOOL
( YES
,NO
).
Я читал, что этот тип почти как символ.
Для тестирования я сделал:
NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));
Приятно видеть, что оба журнала отображают «1» (иногда в C ++ bool имеет тип int, а его размер равен 4)
Так что мне просто интересно, были ли какие-то проблемы с типом bool или что-то в этом роде?
Могу ли я просто использовать bool (который, кажется, работает) без потери скорости?
c
objective-c
types
boolean
Francescu
источник
источник
bool
. Все фреймворки Objective-C используютBOOL
.NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)
// это всегда даетNO
Но как только я получил это(progressTime>=totalTime)
значение вbool
тип,success
он возвращает правильный результат. Я не понимаю это поведение. Я используюXcode 7.x
иiOS
версия была8.x
. @BarryWarkКак уже упоминалось выше, BOOL является подписанным символом. bool - тип из стандарта C99 (int).
BOOL - ДА / НЕТ. bool - правда / ложь.
Смотрите примеры:
И результат
Обратите внимание, что bool! = BOOL. Результат ниже только один раз - реальный b2
Если вы хотите конвертировать bool в BOOL, используйте следующий код
Итак, в нашем случае:
И так .. что мы получаем сейчас? :-)
источник
!!b1
. Для преобразования между нимиНа момент написания статьи это самая последняя версия objc.h:
Это означает, что на 64-битных устройствах iOS и на WatchOS
BOOL
это то же самое, чтоbool
и на всех других устройствах (OS X, 32-битная iOS) этоsigned char
и даже не может быть переопределено флагом компилятора-funsigned-char
Это также означает, что этот пример кода будет работать по-разному на разных платформах (протестировал сам):
КСТАТИ не присваивайте вещи , как
array.count
кBOOL
переменной , потому что около 0,4% от возможных значений будет отрицательным.источник
Objective-C типа вы должны использовать это
BOOL
. Нет ничего похожего на родной логический тип данных, поэтому, чтобы быть уверенным, что код компилируется всеми используемыми компиляторамиBOOL
. (Это определено в Apple-Frameworks.источник
BOOL
определяется языком Objective-C (он находится в одном изobjc/*.h
заголовков), а не фреймворками. Кроме того, при компиляции с C99 (который я думаю по умолчанию), тогда есть родной логический тип_Bool
(или,bool
еслиstdbool.h
включен).Да, BOOL - это typedef для подписанного символа в соответствии с objc.h.
Я не знаю о буле, хотя. Это вещь C ++, верно? Если он определен как символ со знаком, где 1 - YES / true, а 0 - NO / false, тогда я думаю, что не имеет значения, какой из них вы используете.
Поскольку BOOL является частью Objective-C, тем не менее, для ясности, вероятно, имеет смысл использовать BOOL (другие разработчики Objective-C могут быть озадачены, если увидят использование bool).
источник
Другое различие между bool и BOOL заключается в том, что они не преобразуются точно в один и тот же тип объектов, когда вы выполняете наблюдение значения ключа или когда вы используете такие методы, как - [NSObject valueForKey:].
Как все говорили здесь, BOOL - это символ. Как таковой, он преобразуется в NSNumber с символом. Этот объект неотличим от NSNumber, созданного из обычного символа, такого как «A» или «\ 0». Вы полностью потеряли информацию о том, что у вас изначально была БУЛА.
Однако bool преобразуется в CFBoolean, который ведет себя так же, как NSNumber, но сохраняет логическое происхождение объекта.
Я не думаю, что это аргумент в дебатах BOOL vs. bool, но это может укусить вас однажды.
Вообще говоря, вы должны использовать BOOL, поскольку этот тип используется везде в API-интерфейсах Cocoa / iOS (разработан до C99 и его родного типа bool).
источник
Принятый ответ был отредактирован, и его объяснение стало немного неправильным. Образец кода был обновлен, но текст ниже остался прежним. Вы не можете предполагать, что BOOL является символом на данный момент, поскольку он зависит от архитектуры и платформы. Таким образом, если вы запустите свой код на 32-битной платформе (например, iPhone 5) и напечатаете @encode (BOOL), вы увидите «c». Это соответствует типу символа . Но если вы запустите свой код на iPhone 5s (64 бит), вы увидите «B». Это соответствует типу bool .
источник
Я иду против соглашения здесь. Я не люблю typedef для базовых типов. Я думаю, что это бесполезная косвенность, которая убирает ценность.
источник
size_t
), и обаbool
(C99) иBOOL
(ObjC) попадают в эту категорию. И если ваш код потерпел неудачу из-за изменения typedef, виноват ваш код, поскольку вы, очевидно, не рассматривали typedef как непрозрачную вещь, а полагались на его реализацию на одной платформе. (Нечего стыдиться, это случается, но это не typedef, чтобы обвинить.)BOOL varname
вместо логического,char varname
становится более очевидным, что два допустимых значения для этой переменной -true
/YES
илиfalse
/NO
.Как уже упоминалось выше, это
BOOL
может бытьunsigned char
тип в зависимости от вашей архитектуры, в то время какbool
имеет типint
. Простой эксперимент покажет разницу, почему BOOL и bool могут вести себя по-разному:К вашему удивлению
if(objcBOOL != YES)
компилятор оценивает его как 1, такYES
как на самом деле это код символа 1, а в глазах компилятора код символа 64, конечно, не равен коду символа 1, поэтому оператор if будет иметь значение,YES/true/1
а следующая строка будет запустить. Однако, посколькуbool
тип с нулевым нулем всегда оценивается как целочисленное значение 1, вышеуказанная проблема не повлияет на ваш код. Ниже приведены несколько полезных советов, если вы хотите использоватьObjective-C BOOL
тип противANSI C bool
типа:YES
илиNO
значение и ничего больше.BOOL
типы с помощью двойного не!!
оператор чтобы избежать неожиданных результатов.YES
использованияif(!myBool) instead of if(myBool != YES)
гораздо проще использовать!
оператор not и дает ожидаемый результат.источник
Также следует учитывать различия в приведении типов, особенно при работе с битовыми масками, из-за преобразования в подписанные символы:
Если BOOL является знаковым символом вместо bool, приведение 0x0100 к BOOL просто сбрасывает установленный бит, и полученное значение равно 0.
источник