¿Dónde está la diferencia entre setObject: forKey: y setValue: forKey: en NSMutableDictionary?


153

Al mirar la documentación, apenas veo una gran diferencia. Tanto "valor" como "objeto" son de tipo id , por lo que puede ser cualquier objeto. La clave es una vez una cadena y, en el otro caso, una identificación. Uno de ellos parece retener el objeto, y el otro no. ¿Qué más? ¿Cuál es para qué caso?


Respuestas:


163

setValue:forKey:forma parte del protocolo NSKeyValueCoding , que, entre otras cosas, le permite acceder a las propiedades de los objetos de la talla de Interface Builder. setValue:forKey:se implementa en clases distintas a NSDictionary.

setObject:forKey:Es NSMutableDictionary'srazón para existir. Su firma es bastante similar a setValue: forKey :, pero es más genérica (por ejemplo, cualquier tipo de clave). Es una coincidencia que las firmas sean tan similares.

Lo que se agrega a la confusión es que la implementación de NSMutableDictionary setValue:forKey:es equivalente a setObject:forKey:en la mayoría de los casos. En otras clases, setValue:forKey:cambia las variables miembro. En NSMutableDictionary, cambia las entradas del diccionario, a menos que prefiera la clave con un carácter '@', en cuyo caso modifica las variables miembro.

En pocas palabras, úselo setObject:forKey:cuando necesite trabajar con claves y valores del diccionario, y setValue:forKey:en los casos más raros en los que necesite abordar KVP .

EDITAR: y oh, parece que esto se ha preguntado y respondido antes: ¿ Diferencia entre objectForKey y valueForKey?


esa pregunta no es exactamente la misma. se trata de los métodos getter, mientras que esta pregunta se trata de los métodos setter
user102008

1
¿Qué quiere decir con "En NSMutableDictionary, cambia las entradas del diccionario, a menos que prefiera la clave con un carácter '@', en cuyo caso modifica las variables miembro". ¿Qué variables miembro? ¿Quizás también pueda comentar en stackoverflow.com/questions/5755917 ? Gracias.
Peter Štibraný

solo para completar, setObject: forKey se elevará (excepción) si el objeto es nulo. ¿SetValue: forKey se comportará igual, o eliminará el objeto existente del diccionario al configurar nil para key?
Motti Shneor

Gran respuesta. De Verdad. para completar, sin embargo, sería bueno mencionar que (al menos en NSMutableDictionary) setValue: forKey: tolera valores nulos y elimina la entrada, mientras que setObject: forKey: arrojará una excepción y se bloqueará cuando se entreguen valores nulos.
Motti Shneor

83

Otra diferencia es que si le da un valor nulo setValue:forKey:, elimina la clave del diccionario si existe, de lo contrario no hace nada. Pero si le das un valor nulo setObject:forKey:, genera una excepción.


10
Esto es súper útil de saber. De lo contrario, había escrito mi propia categoría en NSMutableDictionary para lograr exactamente esto. Gracias
Arman

2
Otra diferencia es con la suscripción de Objective-C, puede escribir dic[key] = value;para admitir la eliminación de la clave si el valor es nil. La suscripción es generalmente un mejor enfoque que setValue:forKey:lograr esto.
Cœur


4

anObject : el valor de la clave. El objeto recibe un mensaje de retención antes de ser agregado a NSDictionary. Este valor no debe ser nulo.

aKey : la clave del valor. La clave se copia (usando copyWithZone:; las claves deben cumplir con el NSCopyingprotocolo). La clave no debe ser nula.

valor : el valor de la clave.

clave : la clave del valor. Tenga en cuenta que cuando se utiliza la codificación de clave-valor, la clave debe ser una cadena (consulte “Fundamentos de la codificación de clave-valor”).


Gracias por dar la razón actual por la que setObject: forKey: genera una excepción. @breakfreehg
simbesi.com
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.