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

Cuando miro 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 conservar el objeto y el otro no. ¿Qué más? ¿Cuál es para qué caso?

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

setObject:forKey: es NSMutableDictionary's motivo NSMutableDictionary's 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 sum a la confusión es que la implementación de setValue:forKey: 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.

Entonces, en pocas palabras, use 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?

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

-setValue:forKey: simplemente envíe -setObject:forKey: al receptor, a menos que el valor sea nil , en cuyo caso envíe -removeObjectForKey .

Muerto simple.

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

aKey – La clave del valor. La clave se copia (utilizando copyWithZone: claves deben ajustarse al 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 encoding de clave-valor, la clave debe ser una cadena (consulte “Fundamentos de encoding de clave-valor”).