¿Cuál es la diferencia entre objectForKey
y valueForKey
? Los busqué en la documentación y me parecieron lo mismo.
fuente
¿Cuál es la diferencia entre objectForKey
y valueForKey
? Los busqué en la documentación y me parecieron lo mismo.
objectForKey:
Es un NSDictionary
método. An NSDictionary
es una clase de colección similar a una NSArray
, excepto que en lugar de usar índices, usa claves para diferenciar entre elementos. Una clave es una cadena arbitraria que proporciona. No hay dos objetos que puedan tener la misma clave (de la misma manera que no hay dos objetos en un NSArray
puede tener el mismo índice).
valueForKey:
Es un método KVC. Funciona con CUALQUIER clase. valueForKey:
le permite acceder a una propiedad usando una cadena para su nombre. Entonces, por ejemplo, si tengo una Account
clase con una propiedad accountNumber
, puedo hacer lo siguiente:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
Usando KVC, puedo acceder a la propiedad dinámicamente:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
Esos son conjuntos equivalentes de declaraciones.
Sé que estás pensando: wow, pero con sarcasmo. KVC no parece tan útil. De hecho, se ve "prolijo". Pero cuando desea cambiar las cosas en tiempo de ejecución, puede hacer muchas cosas interesantes que son mucho más difíciles en otros idiomas (pero esto está fuera del alcance de su pregunta).
Si quieres aprender más sobre KVC, hay muchos tutoriales si buscas en Google especialmente en el blog de Scott Stevenson . También puede consultar la Referencia del protocolo NSKeyValueCoding .
Espero que ayude.
Cuando lo haga
valueForKey:
, debe darle un NSString, mientras queobjectForKey:
puede tomar cualquier subclase de NSObject como clave. Esto se debe a que para la codificación clave-valor, las claves siempre son cadenas.De hecho, la documentación indica que, incluso cuando le da
valueForKey:
un NSString, invocará deobjectForKey:
todos modos a menos que la cadena comience con un@
, en cuyo caso invoca[super valueForKey:]
, lo que puede llamar, lovalueForUndefinedKey:
que puede generar una excepción.fuente
Aquí hay una gran razón para usar
objectForKey:
siempre que sea posible en lugar de hacerlovalueForKey:
:valueForKey:
con una clave desconocida apareceráNSUnknownKeyException
"esta clase no es compatible con la codificación del valor de clave para la clave".fuente
Como se dijo, el
objectForKey:
tipo de datos es:(id)aKey
mientras que elvalueForKey:
tipo de datos es:(NSString *)key
.Por ejemplo:
Por lo tanto,
valueForKey:
tomará solo un valor de cadena y es un método KVC, mientrasobjectForKey:
que tomará cualquier tipo de objeto.Se
objectForKey
accederá al valor en el mismo tipo de objeto.fuente
Trataré de proporcionar una respuesta integral aquí. Gran parte de los puntos aparecen en otras respuestas, pero encontré cada respuesta incompleta y algunas incorrectas.
En primer lugar,
objectForKey:
es unNSDictionary
método, mientras quevalueForKey:
es un método de protocolo KVC requerido de cualquier clase de queja KVC, incluido NSDictionary.Además, como escribió @dreamlax, la documentación sugiere que
NSDictionary
implementa suvalueForKey:
método USANDO suobjectForKey:
implementación. En otras palabras,[NSDictionary valueForKey:]
llama[NSDictionary objectForKey:]
.Esto implica que
valueForKey:
eso nunca puede ser más rápido queobjectForKey:
(en la misma tecla de entrada) aunque las pruebas exhaustivas que he realizado implican una diferencia de aproximadamente 5% a 15%, sobre miles de millones de acceso aleatorio a un enorme NSDictionary. En situaciones normales, la diferencia es insignificante.A continuación: el protocolo KVC solo funciona con
NSString *
claves, porvalueForKey:
lo tanto , solo aceptará unaNSString *
(o subclase) como clave, mientras queNSDictionary
puede trabajar con otros tipos de objetos como claves, de modo que el "nivel inferior"objectForKey:
acepte cualquier objeto copiable (compatible con el protocolo NSCopying) como clavePor último, la
NSDictionary's
implementación de sevalueForKey:
desvía del comportamiento estándar definido en la documentación de KVC y NO emitirá unaNSUnknownKeyException
clave que no puede encontrar, a menos que sea una clave "especial", una que comienza con '@', que generalmente significa " agregación "tecla de función (por ejemplo@"@sum, @"@avg"
). En cambio, simplemente devolverá un valor nulo cuando no se encuentre una clave en NSDictionary, comportándose igual queobjectForKey:
Lo siguiente es un código de prueba para demostrar y probar mis notas.
fuente