El otro día, un usuario me informó sobre un error en la barra de herramientas que se deshabilitó cuando debería haberse habilitado. El código de validación (simplificado para su beneficio) parecía:¿Por qué un BOOL es un char firmado?
- (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem {
NSArray* someArray = /* arrray from somewhere*/
return [someArray count];
}
Me tomó unos minutos para darse cuenta de que -count devuelve un entero sin signo de 32 bits, mientras que BOOL es un carbón de 8 bits. Dio la casualidad de que en este caso someArray tenía 768 elementos, lo que significaba que los 8 bits inferiores eran todos 0. Cuando el int se envía a BOOL al regresar, se resuelve en NO
, aunque un humano esperaría la respuesta ser YES
.
Desde entonces, he cambiado mi código para return [someArray count] > 0;
sin embargo, ahora tengo curiosidad por qué es realmente un BOOL signed char. ¿Es eso realmente "mejor" de alguna forma que una int?
A menudo verá '!! [someArray count]' por exactamente esta razón (hace casi lo mismo que '> 0') – cobbal
Si piensa en su pregunta un poco más, verá que es más o menos equivalente a "¿Por qué * cualquier tipo * no es lo mismo que un int?" Porque las respuestas son más o menos las mismas. Los tipos escalares más pequeños están ahí porque no requieren el rango completo de un int. BOOL ni siquiera requiere la gama completa de un char firmado, pero no había ningún tipo más pequeño disponible. – Chuck
No debería asignar nada más que el resultado de expresiones booleanas a variables booleanas, sin importar qué tipo real se use para implementar variables booleanas. Revisa tu código para ver otras abominaciones como esta. – Sven