2009-08-08 10 views
148

Guardando la documentazione, non vedo grandi differenze. Sia "valore" che "oggetto" sono di tipo ID, quindi può essere qualsiasi oggetto. La chiave è una volta una stringa, e nell'altro caso un id. Uno di loro sembra mantenere l'oggetto e l'altro no. Cos'altro? Qual è il caso?Dov'è la differenza tra setObject: forKey: e setValue: forKey: in NSMutableDictionary?

+0

possibile duplicato di [Objective-C: Qual è la differenza tra objectForKey e valueForKey?] (Http://stackoverflow.com/questions/1062183/objective-c-whats-the-difference-tra-objectforkey-and-valforforkey – Mark

risposta

157

setValue:forKey: fa parte del protocollo NSKeyValueCoding, che tra le altre cose consente di accedere alle proprietà dell'oggetto da Like Builder. setValue:forKey: è implementato in classi diverse da NSDictionary.

setObject:forKey: è NSMutableDictionary's motivo di esistere. La sua firma sembra essere abbastanza simile a setValue: forKey :, ma è più generico (ad esempio, qualsiasi tipo di chiave). È in qualche modo una coincidenza che le firme siano così simili.

Ciò che aggiunge confusione è che l'implementazione di NSMutableDictionary di setValue:forKey: equivale a setObject:forKey: nella maggior parte dei casi. In altre classi, setValue:forKey: modifica le variabili membro. In NSMutableDictionary, cambia le voci del dizionario, a meno che non si precisi la chiave con un carattere '@' - nel qual caso modifica le variabili membro.

Così, in poche parole, utilizzare setObject:forKey: quando si ha bisogno di lavorare con le chiavi del dizionario e valori, e setValue:forKey: nei casi più rari in cui è necessario affrontare KVP.

EDIT: e oh, sembra che questo è stato chiesto e ha risposto prima: Difference between objectForKey and valueForKey?

+0

questa domanda non è esattamente la stessa.si tratta dei metodi getter, mentre questa domanda riguarda i metodi setter – user102008

+1

Cosa intendi con "In NSMutableDictionary, cambia le voci del dizionario, a meno che tu non prefissi la chiave con un carattere '@' - nel qual caso modifica le variabili membro ". Quali variabili membro? Potresti anche commentare http://stackoverflow.com/questions/5755917/? Grazie. –

+0

solo per completezza, setObject: forKey solleverà (eccezione) se l'oggetto è nullo. SetValue: forKey si comporta allo stesso modo o rimuove l'oggetto esistente dal dizionario quando si imposta nil per la chiave? –

80

Un'altra differenza è che se si dà un valore nullo per setValue:forKey:, rimuove la chiave dal dizionario se esiste, altrimenti non fa niente. Ma se dai un valore nullo a setObject:forKey:, solleva un'eccezione.

+10

Questo è super utile da sapere. Ho altrimenti scritto la mia categoria su NSMutableDictionary per realizzare esattamente questo !. Grazie – Arman

+2

Un'altra differenza è con l'indice obbiettivo-c, puoi scrivere 'dic [chiave] = valore;' per supportare la rimozione della chiave se il valore è 'nil'. La sottoscrizione è generalmente un approccio migliore rispetto a "setValue: forKey:" per ottenere questo risultato. –

3

anObject — Il valore per chiave. L'oggetto riceve un messaggio di conservazione prima di essere aggiunto allo NSDictionary. Questo valore non deve essere nulla.

aKey — La chiave per il valore. La chiave viene copiata (utilizzando copyWithZone:; le chiavi devono essere conformi al protocollo NSCopying). La chiave non deve essere nulla.

valore — Il valore per chiave.

chiave — La chiave per il valore. Si noti che quando si utilizza la codifica del valore chiave, la chiave deve essere una stringa (vedere "Nozioni fondamentali sulla codifica dei valori-chiave").

+0

Grazie per aver dato il motivo per cui setObject: forKey: solleva un'eccezione. @ breakfreehg –

5

-setValue:forKey: solo inviare -setObject:forKey: al ricevitore, a meno che il valore è nil, nel qual caso inviare -removeObjectForKey.

Morto semplice.

+0

Questo è esattamente come funziona. –

+0

oh hai ragione, fratello. Mi dispiace per quello È documentato qui: https://developer.apple.com/reference/foundation/nsmutabledictionary/1416335-setvalue?language=objc – Eddie

Problemi correlati