Wo ist der Unterschied zwischen setObject: forKey: und setValue: forKey: in NSMutableDictionary?

153

Wenn ich mir die Dokumentation ansehe, sehe ich kaum einen großen Unterschied. Sowohl "Wert" als auch "Objekt" sind vom Typ ID , können also jedes Objekt sein. Der Schlüssel ist einmal eine Zeichenfolge und im anderen Fall eine ID. Einer von ihnen scheint das Objekt zu behalten, der andere nicht. Was sonst? Welches ist für welchen Fall?

EI Captain v2.0
quelle

Antworten:

163

setValue:forKey:ist Teil des NSKeyValueCoding- Protokolls, mit dem Sie unter anderem auf Objekteigenschaften wie Interface Builder zugreifen können. setValue:forKey:wird in anderen Klassen als implementiert NSDictionary.

setObject:forKey:ist NSMutableDictionary'sGrund zu existieren. Die Signatur ist setValue: forKey: ziemlich ähnlich, ist jedoch allgemeiner (z. B. ein beliebiger Schlüsseltyp). Es ist ein Zufall, dass die Signaturen so ähnlich sind.

Was zur Verwirrung beiträgt, ist, dass die Implementierung von NSMutableDictionary in den meisten Fällen setValue:forKey:gleichwertig setObject:forKey:ist. In anderen Klassen werden setValue:forKey:Mitgliedsvariablen geändert. In NSMutableDictionarywerden Wörterbucheinträge geändert, es sei denn, Sie stellen dem Schlüssel ein '@' voran. In diesem Fall werden Mitgliedsvariablen geändert.

Kurz gesagt, verwenden setObject:forKey:Sie diese Option, wenn Sie mit Wörterbuchschlüsseln und -werten arbeiten müssen, und setValue:forKey:in den selteneren Fällen, in denen Sie sich mit KVP befassen müssen .

EDIT: und oh, es sieht so aus, als ob dies schon einmal gefragt und beantwortet wurde: Unterschied zwischen objectForKey und valueForKey?

Oren Trutner
quelle
Diese Frage ist nicht genau die gleiche. Es geht um die Getter-Methoden, während es bei dieser Frage um die Setter-Methoden geht
user102008
1
Was meinen Sie mit "In NSMutableDictionary werden Wörterbucheinträge geändert, es sei denn, Sie stellen dem Schlüssel ein '@' voran - in diesem Fall werden Mitgliedsvariablen geändert." Welche Mitgliedsvariablen? Vielleicht können Sie auch stackoverflow.com/questions/5755917 kommentieren ? Vielen Dank.
Peter Štibraný
Nur der Vollständigkeit halber setzt setObject: forKey (Ausnahme), wenn das Objekt Null ist. Verhält sich setValue: forKey gleich oder entfernt es ein vorhandenes Objekt aus dem Wörterbuch, wenn für den Schlüssel nil festgelegt wird?
Motti Shneor
Gute Antwort. Ja wirklich. Der Vollständigkeit halber wäre es jedoch schön zu erwähnen, dass (zumindest in NSMutableDictionary) setValue: forKey: Nullwerte toleriert und den Eintrag entfernt - während setObject: forKey: Ausnahme und Absturz auslöst, wenn Nullwerte übergeben werden.
Motti Shneor
83

Ein weiterer Unterschied besteht darin, dass, wenn Sie einen Nullwert setValue:forKey:angeben, der Schlüssel aus dem Wörterbuch entfernt wird, falls vorhanden, andernfalls nichts. Wenn Sie jedoch einen Nullwert angeben setObject:forKey:, wird eine Ausnahme ausgelöst.

user102008
quelle
10
Das ist super nützlich zu wissen. Ich hatte ansonsten meine eigene Kategorie auf NSMutableDictionary geschrieben, um genau dies zu erreichen!. Vielen Dank
Arman
2
Ein weiterer Unterschied besteht darin, dass Sie mit Objective-C-Subskription schreiben können, dic[key] = value;um das Entfernen des Schlüssels zu unterstützen, wenn der Wert gleich ist nil. Das Abonnieren ist im Allgemeinen ein besserer Ansatz, als dies setValue:forKey:zu erreichen.
Cœur
4

anObject - Der Wert für key. Das Objekt erhält eine Aufbewahrungsnachricht, bevor es zum hinzugefügt wird NSDictionary. Dieser Wert darf nicht Null sein.

aKey - Der Schlüssel zum Wert. Der Schlüssel wird kopiert (mit copyWithZone:; Schlüssel müssen dem NSCopyingProtokoll entsprechen). Der Schlüssel darf nicht Null sein.

value - Der Wert für key.

Schlüssel - Der Schlüssel für den Wert. Beachten Sie, dass bei Verwendung der Schlüsselwertcodierung der Schlüssel eine Zeichenfolge sein muss (siehe „Grundlagen der Schlüsselwertcodierung“).

breakfreehg
quelle
Vielen Dank, dass Sie den tatsächlichen Grund angegeben haben, warum setObject: forKey: eine Ausnahme auslöst. @breakfreehg
simbesi.com