valueForKey:
(y la mayoría de los demás métodos Cocoa) devuelve un puntero (dirección de memoria) a un objeto. Cuando usa el símbolo ==
, simplemente prueba el valor numérico de ese puntero y no el valor real de la cadena. Cuando usa isEqualToString:
, está probando el valor.
Estos dos:
if ([dictionary valueForKey:@"aString"]==nil)
if ([dictionary valueForKey:@"aString"]==NULL)
son más o menos equivalentes y ambos prueba "fue la dirección devuelta igual a cero?", Que es como valueForKey:
indica que no había objeto encontrado para esa tecla. Si el diccionario contiene cualquier objeto para esa clave, independientemente de su valor (por ejemplo, incluso una cadena vacía), esta instrucción if devuelve falso.
(normalmente utiliza la versión nil
en Objective-C, como una convención estilo tanto como cualquier otra cosa)
Este:
if ([[dictionary valueForKey:@"aString"] isEqualToString:@""])
prueba el valor real de la cadena para ver si se trata de una cadena de longitud cero. Si no hay ningún objeto en el diccionario, devolverá falso, ya que cuando llama al isEqualToString:
(o casi cualquier otro método) contra un puntero nil
siempre obtiene cero o falso.
valueForKey: es para la codificación de valores clave. Debería usar objectForKey: para obtener cosas de un diccionario. Aunque hace casi lo mismo, es marginalmente más rápido y funciona correctamente para las claves que comienzan con un signo @. – JeremyP