Hay alguna diferencia entre bool, Boolean, y BOOL en Objective-C?

Sé BOOL es en realidad un typedef de signed char, pero ¿qué pasa Booleano?

¿Cuál es la diferencia entre bool, Boolean y BOOL?

  • Objective-C no tiene un tipo llamado «Boolean» o «bool», se puede aclarar tu pregunta?
  • No sé, Boolean aparece en la FQ de la biblioteca…
  • Claro que sí. Es C, de forma que también los tiene. Y C++ cosas.
InformationsquelleAutor Frost | 2010-06-10

3 Kommentare

  1. 48

    Boolean es un viejo de Carbono de la palabra clave (histórico de tipo Mac), que se define como un unsigned char. BOOL es un Objetivo-C tipo definido como signed char. bool está definido versión de la _Bool estándar de C tipo. Se define como un int. Uso BOOL.

    Editar (2019): habla de Apple acerca de la implementación subyacente de BOOL en algunos nueva documentación. Básicamente, en macOS, BOOL sigue siendo en última instancia un signed char, pero en iOS y las plataformas, es un nativo de C bool debajo.

    • Boolean se utiliza en CoreFoundation (el cual el Carbono es en su mayoría construidas en la parte superior de ahora), así que mientras que usted debe utilizar BOOL en objective-C, cuando se trata de cualquier CoreFoundation Api, Boolean todavía está en uso.
    • Ah, ya veo, así que debo utilizar BOOL para uso común y Booleano en la FQ. Gracias!
    • Ups, tienes razón. CoreFoundation que hace es definir una versión de Boolean, pero que está separado de Carbono de la definición. Ver MacOSTypes.h vs OSTypes.h. Y en sistemas de 64 bits que no hacen uso de C99, CoreFoundation del Boolean es un unsigned char.
    • De objc.h: // BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" // even if -funsigned-char is used. Así BOOL para Objective-C, Boolean para todo lo demás.
    • Si stdbool.h se incluye en C99, entonces bool es una macro expansión a _Bool, que es un cierto tipo Booleano que representa, ya sea 0 o 1, no es un int.
    • Hoy en día, uno siempre debe utilizar bool (incluyendo stdbool.h si no codificación en [Objetivo] C++), excepto para interactuar con las APIs existentes que utilice uno de los tipos más antiguos. Usando un verdadero tipo Booleano (sólo puede tomar los valores 0 y 1, cualquier entero distinto de cero convierte a true automágicamente) borra toda clase de posibles errores.
    • Zack, esto también introduce una clase de insectos llamados puntero a bool conversiones. Todavía prefieren bool sobre BOOL aunque.
    • es derecho. BOOL v = 2; NSLog(@"%d", v); salidas «1», no «2». Referencia a la la documentación de Apple

  2. 3

    No quiero tomar distancia de @JonShier útil de la respuesta, pero tengo más que añadir que encaja muy bien en un comentario…

    bool

    Introducido en C estándar en la C99 spec. (El estándar C99 fue publicado en 1999, pero tomó algunos años después de que se generalizó en uso). Antes de eso, «llanura» C no tenía incorporado en el tipo Booleano, por lo que las bibliotecas que se construye en la parte superior de C a menudo se definen sus propios. (Y, a menudo, continuaron utilizando sus propios tipos de fuente/compatibilidad binaria, incluso después de que habían abrazado C99 compiladores.)

    Use esta opción si usted está escribiendo ISO C y no están trabajando en el contexto de un nivel más alto de las bibliotecas, con sus propios tipos Boolean.

    Boolean

    Definido por Carbono (principios-OSX-días de compatibilidad puente de la aún más antigua Mac caja de herramientas), que usted todavía puede ver en algunos proyectos (debido a la transitiva #include de encabezados que son sólo alrededor de la compatibilidad con muy viejo código fuente).

    No hacen uso de esta.

    BOOL

    Definido por ObjC porque NeXTSTEP necesita su propio tipo Booleano en 1988. (La más antigua objc.h me pueden encontrar en mi oficina, estantería remonta a 1992, y se incluye una definición de BOOL.)

    ObjC BOOL a menudo se ha definido como typedef signed char, lo que significa que puede tener más valores que sólo YES (1) y NO (0). Que puede ser un problema si usted no tiene cuidado. (¿Por qué hacer eso? Porque si un tipo es un poco ancho, es difícil pack en bien alineado a la memoria para un buen rendimiento.)

    Sin embargo, en iOS de 64 bits (incluyendo tvOS) y watchOS, el compilador define OBJC_BOOL_IS_BOOL, lo que hace que ObjC BOOL sólo un alias para C99 bool. Eso significa que la lengua/el compilador se asegura de que los valores distintos de cero se almacenan siempre 1, por lo que no tiene los problemas que vienen de typedef signed char BOOL. (Todavía tengo que preocuparse acerca de ellos en macOS o de 32 bits de iOS, sin embargo.)

    TLDR

    Si usted está trabajando en ObjC con ObjC marcos (como el Cacao, el UIKit, etc), se debe usar BOOL para mantener la coherencia con las APIs que está interactuando. (Además, YES y NO son mucho más fuertes que true y false, y es bueno ser enfático cuando usted está hablando acerca de la verdad absoluta, verdad?)

  3. 0

    Si su nueva Api no necesitan interactuar con los viejos, bool es más específico y claro de BOOL.

    Cuando la construcción de un no-aplicación de Mac con Xcode 9, BOOL v = 2; NSLog(@"%d", v); salidas «1», no «2».

    Referencia a La documentación de Apple

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea