objective-c cocoa key-value-coding

objective c - ¿Diferencia entre objectForKey y valueForKey?



objective-c cocoa (4)

Como se dijo, el tipo de datos objectForKey: es :(id)aKey mientras que el tipo de datos valueForKey: es :(NSString *)key .

Por ejemplo:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil]; NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]); //This will work fine and prints ( 123 ) NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]); //it gives warning "Incompatible pointer types sending ''NSNumber *'' to parameter of type ''NSString *''" ---- This will crash on runtime.

Entonces, valueForKey: tomará solo un valor de cadena y es un método KVC, mientras que objectForKey: tomará cualquier tipo de objeto.

El valor en objectForKey será accedido por el mismo tipo de objeto.

¿Cuál es la diferencia entre objectForKey y valueForKey ? Busqué los dos en la documentación y me parecieron iguales.


Cuando haces valueForKey: necesitas asignarle una NSString, mientras que objectForKey: puede tomar cualquier subclase de NSObject como una clave. Esto se debe a que, para la codificación de clave-valor, las claves son siempre cadenas.

De hecho, la documentación indica que incluso cuando se valueForKey: NSString, invocará objectForKey: todos modos, a menos que la cadena comience con una @ , en cuyo caso invoca [super valueForKey:] , que puede llamar a valueForUndefinedKey: que puede valueForUndefinedKey: una excepción.


Esta es una buena razón para usar objectForKey: siempre que sea posible en lugar de valueForKey: - valueForKey: con una clave desconocida lanzará NSUnknownKeyException dice "esta clase no cumple con la codificación de valores de clave para la clave".


objectForKey: es un método NSDictionary . Un 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 proporcionas. No hay dos objetos que puedan tener la misma clave (al igual que dos objetos en una NSArray pueden tener el mismo índice).

valueForKey: es un método KVC. Funciona con cualquier clase. valueForKey: permite acceder a una propiedad usando una cadena para su nombre. Entonces, por ejemplo, si tengo una clase de Account con un número de cuenta de propiedad, 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 sarcásticamente. KVC no parece tan útil. De hecho, se ve "wordy". Pero cuando desea cambiar las cosas en tiempo de ejecución, puede hacer muchas cosas geniales que son mucho más difíciles en otros idiomas (pero esto está fuera del alcance de su pregunta).

Si desea obtener más información sobre KVC, hay muchos tutoriales si realiza una búsqueda en Google en el blog de Scott Stevenson . También puede consultar la referencia del protocolo NSKeyValueCoding .

Espero que ayude.