Como mencionado acima, BOOL
pode ser um unsigned char
tipo, dependendo da sua arquitetura, enquanto bool
é do tipo int
. Uma experiência simples mostrará a diferença por que BOOL e bool podem se comportar de maneira 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 sua surpresa if(objcBOOL != YES)
, o 1 será avaliado pelo compilador, uma vez que, YES
na verdade , é o código de caractere 1 e, aos olhos do compilador, o código de caractere 64 não é, obviamente, igual ao código de caractere 1, portanto, a instrução if será avaliada comoYES/true/1
e a linha a seguir será corre. No entanto, como um bool
tipo nenhum zero avalia sempre o valor inteiro 1, o problema acima não afetará seu código. Abaixo estão algumas boas dicas se você deseja usar o Objective-C BOOL
tipo versus o ANSI C bool
tipo:
- Sempre atribua o valor
YES
ou NO
nada mais.
- Converter
BOOL
tipos usando o !!
operador double not para evitar resultados inesperados.
- Ao verificar o
YES
uso if(!myBool) instead of if(myBool != YES)
, é muito mais limpo usar o !
operador not e fornece o resultado esperado.