2009-08-08 10 views
148

Cuando miro la documentación, apenas veo una gran diferencia. Tanto "valor" como "objeto" son del 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 conservar el objeto y el otro no. ¿Qué más? ¿Cuál es para qué caso?¿Dónde está la diferencia entre setObject: forKey: y setValue: forKey: en NSMutableDictionary?

+0

posible duplicado de [Objective-C: ¿Cuál es la diferencia entre objectForKey y valueForKey?] (Http://stackoverflow.com/questions/1062183/objective-c-whats-the-difference-between-objectforkey-and-valueforkey) – Mark

Respuesta

157

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

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

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

Así, en pocas palabras, utilice setObject:forKey: cuando se necesita para trabajar con claves de diccionarios y valores, y setValue:forKey: en los casos más raros en las que necesita para hacer frente a KVP.

EDIT: y oh, parece que esto se ha preguntado y contestado antes: Difference between objectForKey and valueForKey?

+0

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

+1

¿Qué quiere decir con "En NSMutableDictionary, cambia las entradas del diccionario, a menos que prefija la tecla con un carácter '@' - en cuyo caso se modifican las variables miembro " ¿Qué variables de miembro? También tal vez puedas comentar en http://stackoverflow.com/questions/5755917/? Gracias. –

+0

solo para completar, setObject: forKey aumentará (excepción) si object es nil. ¿SetValue: forKey se comportará igual, o eliminará el objeto existente del diccionario al establecer nil para la clave? –

80

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

+10

Esto es muy útil para saber. ¡De lo contrario, había escrito mi propia categoría en NSMutableDictionary para lograr exactamente esto !. Gracias – Arman

+2

Otra diferencia es con el objetivo-c subscripting, puede escribir 'dic [key] = value;' para apoyar la eliminación de la clave si el valor es 'nil'. Subscribir es generalmente un mejor enfoque que 'setValue: forKey:' para lograr esto. –

3

anObject — El valor de la clave. El objeto recibe un mensaje de retención antes de agregarse al NSDictionary. Este valor no debe ser nulo.

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

valor — El valor de la clave.

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

+0

Gracias por dar la razón atual por la cual setObject: forKey: genera una excepción. @breakfreehg –

5

-setValue:forKey: acaba de enviar -setObject:forKey: al receptor, a menos que el valor es nil, en cuyo caso se enviará -removeObjectForKey.

Muerto simple.

+0

Así es exactamente como funciona. –

+0

oh tienes razón, hermano. Lo siento por eso. Está documentado aquí: https://developer.apple.com/reference/foundation/nsmutabledictionary/1416335-setvalue?language=objc – Eddie

Cuestiones relacionadas