Vi el "nuevo tipo" BOOL ( YES, NO).
Leí que este tipo es casi como un char.
Para probar lo hice:
NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));
Es bueno ver que ambos registros muestran "1" (a veces en C ++ bool es un int y su tamaño es 4)
¿Entonces me preguntaba si había algunos problemas con el tipo bool o algo así?
¿Puedo usar bool (que parece funcionar) sin perder velocidad?
c
objective-c
types
boolean
Francescu
fuente
fuente

bool. Todos los marcos de Objective-C utilizanBOOL.NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)// siempre daNOPero una vez que recibí ese(progressTime>=totalTime)valor enbooltiposuccess, devuelve el resultado correcto. No entiendo este comportamiento. Estoy usandoXcode 7.xy laiOSversión fue8.x. @BarryWarkComo se mencionó anteriormente, BOOL es un personaje firmado. bool - tipo del estándar C99 (int).
BOOL - SÍ / NO. bool - verdadero / falso.
Ver ejemplos:
Y el resultado es
Tenga en cuenta que bool! = BOOL. El resultado a continuación es solo UNA VEZ MÁS - REAL b2
Si desea convertir bool a BOOL, debe usar el siguiente código
Entonces, en nuestro caso:
Y entonces ... ¿qué tenemos ahora? :-)
fuente
!!b1. Para convertir entre ellosAl momento de escribir esta es la versión más reciente de objc.h:
Significa que en dispositivos iOS de 64 bits y en WatchOS
BOOLes exactamente lo mismo queboolen todos los demás dispositivos (OS X, iOS de 32 bits) essigned chary ni siquiera puede ser anulado por el indicador del compilador-funsigned-charTambién significa que este código de ejemplo se ejecutará de manera diferente en diferentes plataformas (lo probé yo mismo):
Por cierto, las cosas nunca asignar gusta
array.countaBOOLla variable ya que aproximadamente el 0,4% de los valores posibles será negativo.fuente
El tipo de Objective-C que debe usar es
BOOL. No hay nada como un tipo de datos booleano nativo, por lo tanto, para asegurarse de que el código se compila en todos los compiladoresBOOL. (Está definido en Apple-Frameworks.fuente
BOOLestá definido por el lenguaje Objective-C (está en uno de losobjc/*.hencabezados), no por los marcos. Además, al compilar con C99 (que creo que es el predeterminado), entonces hay un tipo booleano nativo_Bool(oboolsistdbool.hestá incluido).Sí, BOOL es un typedef para un carácter firmado de acuerdo con objc.h.
Sin embargo, no sé sobre bool. Eso es una cosa de C ++, ¿verdad? Si se define como un carácter firmado donde 1 es SÍ / verdadero y 0 es NO / falso, entonces imagino que no importa cuál use.
Sin embargo, dado que BOOL es parte de Objective-C, probablemente tenga más sentido usar un BOOL para mayor claridad (otros desarrolladores de Objective-C podrían quedar perplejos si ven un bool en uso).
fuente
Otra diferencia entre bool y BOOL es que no se convierten exactamente al mismo tipo de objetos, cuando observas valores-clave, o cuando usas métodos como - [NSObject valueForKey:].
Como todos han dicho aquí, BOOL es char. Como tal, se convierte en un NSNumber con un carácter. Este objeto no se puede distinguir de un NSNumber creado a partir de un carácter normal como 'A' o '\ 0'. Has perdido totalmente la información de que originalmente tenías un BOOL.
Sin embargo, bool se convierte en un CFBoolean, que se comporta igual que NSNumber, pero que conserva el origen booleano del objeto.
No creo que este sea un argumento en un debate BOOL vs. bool, pero esto puede morderte algún día.
En términos generales, debe usar BOOL, ya que este es el tipo utilizado en todas partes en las API de Cocoa / iOS (diseñado antes de C99 y su tipo de bool nativo).
fuente
La respuesta aceptada ha sido editada y su explicación se volvió un poco incorrecta. El ejemplo de código se ha actualizado, pero el texto a continuación permanece igual. No puede suponer que BOOL es un char por ahora, ya que depende de la arquitectura y la plataforma. Por lo tanto, si ejecuta su código en la plataforma de 32 bits (por ejemplo, iPhone 5) e imprime @encode (BOOL) verá "c". Corresponde a un tipo char . Pero si ejecuta su código en el iPhone 5s (64 bits) verá "B". Corresponde a un tipo bool .
fuente
Voy en contra de la convención aquí. No me gusta typedef's a los tipos base. Creo que es una indirección inútil que elimina el valor.
fuente
size_t), y ambosbool(C99) yBOOLotoño (ObjC) en esa categoría. Y si su código falló debido a un cambio de typedef, es su código el culpable, ya que aparentemente no manejó el typedef como algo opaco, sino que confió en su implementación en una plataforma. (Nada de lo que avergonzarse, sucede, pero no es el culpable de typedef.)BOOL varnamelugar dechar varnameesto, es más obvio que los dos valores válidos para esa variable sontrue/YESofalse/NO.Como se mencionó anteriormente,
BOOLpodría ser ununsigned chartipo dependiendo de su arquitectura, mientras quebooles de tipoint. Un experimento simple mostrará la diferencia por qué BOOL y bool pueden comportarse de manera diferente:Para su sorpresa
if(objcBOOL != YES), el compilador evaluará a 1, yaYESque en realidad es el código de caracteres 1, y a los ojos del compilador, el código de caracteres 64 no es, por supuesto, igual al código de caracteres 1, por lo tanto, la instrucción if se evaluaráYES/true/1y la siguiente línea será correr. Sin embargo, dado que unbooltipo distinto de cero siempre se evalúa como el valor entero de 1, el problema anterior no afectará su código. A continuación se presentan algunos buenos consejos si desea utilizar elObjective-C BOOLtipo frente alANSI C booltipo:YESoNOy nada más.BOOLtipos utilizando el!!operador doble no para evitar resultados inesperados.YESusoif(!myBool) instead of if(myBool != YES), es mucho más limpio usar el!operador no y da el resultado esperado.fuente
Además, tenga en cuenta las diferencias en la conversión, especialmente cuando trabaje con máscaras de bits, debido a la conversión a caracteres firmados:
Si BOOL es un carácter firmado en lugar de un bool, el reparto de 0x0100 a BOOL simplemente deja caer el bit establecido y el valor resultante es 0.
fuente