Objetivo-C: BOOL vs bool

Vi el “nuevo tipo” BOOL ( YES , NO ).

Leí que este tipo es casi como un char.

Para las pruebas que 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 algún problema con el tipo bool o algo así.

¿Puedo usar bool (que parece funcionar) sin perder velocidad?

De la definición en objc.h :

 #if (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH typedef bool BOOL; #else typedef signed char BOOL; // BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" // even if -funsigned-char is used. #endif #define YES ((BOOL)1) #define NO ((BOOL)0) 

Entonces, sí, puedes asumir que BOOL es un char. Puedes usar el tipo bool (C99), pero todos los frameworks Objective-C de Apple y la mayoría del código Objective-C / Cocoa usan BOOL, así que te ahorrarás dolores de cabeza si el typedef cambia alguna vez usando solo BOOL.

Como se mencionó anteriormente, BOOL es un char firmado. bool – tipo del estándar C99 (int).

BOOL – SÍ / NO. bool – verdadero / falso.

Ver ejemplos:

 bool b1 = 2; if (b1) printf("REAL b1 \n"); if (b1 != true) printf("NOT REAL b1 \n"); BOOL b2 = 2; if (b2) printf("REAL b2 \n"); if (b2 != YES) printf("NOT REAL b2 \n"); 

Y el resultado es

REAL b1
REAL b2
NO REAL b2

Tenga en cuenta que bool! = BOOL. El resultado a continuación es solo UNA VEZ MÁS – REAL b2

 b2 = b1; if (b2) printf("ONCE AGAIN - REAL b2 \n"); if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n"); 

Si quieres convertir bool a BOOL deberías usar el siguiente código

 BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false; 

Entonces, en nuestro caso:

 BOOL b22 = b1 ? 2 : NO; if (b22) printf("ONCE AGAIN MORE - REAL b22 \n"); if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n"); 

Y entonces … ¿qué tenemos ahora? 🙂

En el momento de escribir esta es la versión más reciente de objc.h:

 /// Type to represent a boolean value. #if (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH #define OBJC_BOOL_IS_BOOL 1 typedef bool BOOL; #else #define OBJC_BOOL_IS_CHAR 1 typedef signed char BOOL; // BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" // even if -funsigned-char is used. #endif 

Significa que en dispositivos iOS de 64 bits y WatchOS BOOL es exactamente lo mismo que bool mientras que en todos los demás dispositivos (OS X, iOS de 32 bits) está signed char y ni siquiera puede ser anulado por el indicador del comstackdor -funsigned-char

También significa que este código de ejemplo se ejecutará de manera diferente en diferentes plataformas (lo probé yo mismo):

 int myValue = 256; BOOL myBool = myValue; if (myBool) { printf("i'm 64-bit iOS"); } else { printf("i'm 32-bit iOS"); } 

Por cierto, nunca asigne cosas como array.count a variable BOOL porque aproximadamente 0.4% de los valores posibles serán negativos.

El tipo Objective-C que debes usar es BOOL . No hay nada como un tipo de datos booleano nativo, por lo tanto, para estar seguro de que el código se comstack en todos los comstackdores usan BOOL . (Está definido en Apple-Frameworks.

Sí, BOOL es un typedef para un char firmado según objc.h.

Aunque no sé nada de bool. Eso es algo de C ++, ¿verdad? Si se define como un carácter firmado donde 1 es SÍ / verdadero y 0 es NO / falso, entonces me 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).

Otra diferencia entre bool y BOOL es que no se convierten exactamente al mismo tipo de objetos, cuando se realiza una observación de valores-clave o cuando se usan métodos como – [NSObject valueForKey:].

Como todos han dicho aquí, BOOL es char. Como tal, se convierte en un NSNumber que contiene un char. Este objeto es indistinguible de un NSNumber creado a partir de un carácter normal como ‘A’ o ‘\ 0’. Has perdido por completo la información de que originalmente tenías un BOOL.

Sin embargo, bool se convierte en CFBoolean, que se comporta igual que NSNumber, pero que conserva el origen booleano del objeto.

No creo que esto sea un argumento en un debate BOOL vs. bool, pero esto puede morderlo algún día.

En general, debe ir con 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).

La respuesta aceptada ha sido editada y su explicación es un poco incorrecta. La muestra del código se ha actualizado, pero el texto a continuación se mantiene igual. No puede suponer que BOOL es un char por ahora ya que depende de la architecture 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 de carácter . Pero si ejecuta su código en el iPhone 5s (64 bit), verá “B”. Corresponde a un tipo bool .

Voy contra la convención aquí. No me gusta typedef’s para tipos de base. Creo que es una indirección inútil que elimina el valor.

  1. Cuando vea el tipo de base en tu fuente, lo entenderé al instante. Si es un typedef, tengo que buscarlo para ver a qué me refiero.
  2. Cuando se transfiere a otro comstackdor o se agrega otra biblioteca, su conjunto de tipos de archivos puede entrar en conflicto y causar problemas que son difíciles de depurar. Acabo de hacer frente a esto de hecho. En una biblioteca boolean fue typedef’ed to int, y en mingw / gcc es typedef’ed a char.

Como se mencionó anteriormente, BOOL podría ser un tipo de unsigned char según su architecture, mientras que bool es del tipo int . Un experimento simple mostrará la diferencia por qué BOOL y bool pueden comportarse de manera diferente:

 bool ansicBool = 64; if(ansicBool != true) printf("This will not print\n"); printf("Any given vlaue other than 0 to ansicBool is evaluated to %i\n", ansicBool); BOOL objcBOOL = 64; if(objcBOOL != YES) printf("This might print depnding on your architecture\n"); printf("BOOL will keep whatever value you assign it: %i\n", objcBOOL); if(!objcBOOL) printf("This will not print\n"); printf("! operator will zero objcBOOL %i\n", !objcBOOL); if(!!objcBOOL) printf("!! will evaluate objcBOOL value to %i\n", !!objcBOOL); 

Para su sorpresa, if(objcBOOL != YES) se evalúa a 1 por el comstackdor, ya que YES es en realidad el código de carácter 1, y para los ojos del comstackdor, el código de carácter 64 no es por supuesto igual al código de carácter 1 evaluará a YES/true/1 y se ejecutará la siguiente línea. Sin embargo, dado que un tipo de bool sin cero siempre se evalúa como el valor entero de 1, el problema anterior no afectará a su código. A continuación encontrará algunos consejos útiles si desea usar el tipo Objective-C BOOL frente al tipo ANSI C bool :

  • Siempre asigne el valor YES o NO y nada más.
  • ¡Convierte tipos BOOL usando double not !! operador para evitar resultados inesperados.
  • Cuando compruebe YES use if(!myBool) instead of if(myBool != YES) es mucho más limpio utilizar el no ! operador y da el resultado esperado.
    Intereting Posts