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 daNO
Pero una vez que recibí ese(progressTime>=totalTime)
valor enbool
tiposuccess
, devuelve el resultado correcto. No entiendo este comportamiento. Estoy usandoXcode 7.x
y laiOS
versió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
BOOL
es exactamente lo mismo quebool
en todos los demás dispositivos (OS X, iOS de 32 bits) essigned char
y ni siquiera puede ser anulado por el indicador del compilador-funsigned-char
Tambié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.count
aBOOL
la 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
BOOL
está definido por el lenguaje Objective-C (está en uno de losobjc/*.h
encabezados), no por los marcos. Además, al compilar con C99 (que creo que es el predeterminado), entonces hay un tipo booleano nativo_Bool
(obool
sistdbool.h
está 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) yBOOL
otoñ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 varname
lugar dechar varname
esto, es más obvio que los dos valores válidos para esa variable sontrue
/YES
ofalse
/NO
.Como se mencionó anteriormente,
BOOL
podría ser ununsigned char
tipo dependiendo de su arquitectura, mientras quebool
es 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, yaYES
que 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/1
y la siguiente línea será correr. Sin embargo, dado que unbool
tipo 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 BOOL
tipo frente alANSI C bool
tipo:YES
oNO
y nada más.BOOL
tipos utilizando el!!
operador doble no para evitar resultados inesperados.YES
usoif(!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