156 Stimmen

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

Wenn ich mir die Dokumentation ansehe, sehe ich kaum einen großen Unterschied. Sowohl "Wert" als auch "Objekt" sind vom Typ id kann also ein beliebiges Objekt sein. Key ist einmal eine Zeichenkette, und im anderen Fall eine id. Einer von ihnen scheint das Objekt zu behalten, der andere nicht. Was noch? Welche ist für welchen Fall?

0 Stimmen

167voto

Oren Trutner Punkte 23106

setValue:forKey: ist Teil der NSKeyValueCoding Protokoll, das unter anderem den Zugriff auf Objekteigenschaften aus Interface Builder ermöglicht. setValue:forKey: in anderen Klassen implementiert ist als NSDictionary .

setObject:forKey: es NSMutableDictionary's Grund zu existieren. Seine Signatur ähnelt der von setValue:forKey:, ist aber allgemeiner (z. B. für jeden Schlüsseltyp). Es ist eher ein Zufall, dass die Signaturen so ähnlich sind.

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

Así que, Kurz gesagt, verwenden Sie setObject:forKey: 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 .

EDIT: und oh, es sieht so aus, als wäre diese Frage schon einmal gestellt und beantwortet worden: Unterschied zwischen objectForKey und valueForKey?

0 Stimmen

Diese Frage ist nicht genau dieselbe. Sie bezieht sich auf die Getter-Methoden, während es in dieser Frage um die Setter-Methoden geht.

1 Stimmen

Was meinen Sie mit "In NSMutableDictionary werden Wörterbucheinträge geändert, es sei denn, Sie stellen dem Schlüssel ein '@'-Zeichen voran - in diesem Fall werden Mitgliedsvariablen geändert." Welche Mitgliedsvariablen? Vielleicht können Sie auch kommentieren stackoverflow.com/questions/5755917 ? Danke!

0 Stimmen

Nur der Vollständigkeit halber: setObject:forKey löst eine (Ausnahme) aus, wenn object nil ist. Wird sich setValue:forKey genauso verhalten, oder wird es das vorhandene Objekt aus dem Wörterbuch entfernen, wenn es für den Schlüssel null ist?

86voto

user102008 Punkte 29575

Ein weiterer Unterschied besteht darin, dass Sie, wenn Sie einen Nullwert für setValue:forKey: wird der Schlüssel aus dem Wörterbuch entfernt, falls er existiert, andernfalls bleibt er unverändert. Wenn Sie jedoch einen Nullwert an setObject:forKey: löst er eine Ausnahme aus.

11 Stimmen

Das ist sehr nützlich zu wissen. Ich hatte sonst meine eigene Kategorie auf NSMutableDictionary geschrieben, um genau das zu erreichen! Danke

2 Stimmen

Ein weiterer Unterschied besteht darin, dass Sie mit objective-c subscripting schreiben können dic[key] = value; um das Entfernen des Schlüssels zu unterstützen, wenn der Wert nil . Subscripting ist im Allgemeinen ein besserer Ansatz als setValue:forKey: um dies zu erreichen.

11voto

Jakub Truhlář Punkte 18280

-setValue:forKey: einfach senden -setObject:forKey: an den Empfänger, es sei denn, der Wert ist nil in diesem Fall senden Sie -removeObjectForKey .

Ganz einfach.

0 Stimmen

Oh, du hast Recht, Bruder. Entschuldige bitte. Es ist hier dokumentiert: developer.apple.com/reference/foundation/nsmutabledictionary/

4voto

breakfreehg Punkte 618

anObject - Der Wert für key. Das Objekt erhält eine Retain-Meldung, bevor es in die NSDictionary . Dieser Wert darf nicht gleich Null sein.

aKey - Der Schlüssel zum Wert. Der Schlüssel wird kopiert (mit copyWithZone: Die Schlüssel müssen mit den NSCopying Protokoll). Der Schlüssel darf nicht gleich Null sein.

Wert - Der Wert für key.

Schlüssel - Der Schlüssel für den Wert. Beachten Sie, dass bei der Verwendung von Schlüssel-Wert-Codierung der Schlüssel eine Zeichenkette sein muss (siehe "Grundlagen der Schlüssel-Wert-Codierung").

0 Stimmen

Danke für die Angabe des tatsächlichen Grundes, warum setObject:forKey: eine Ausnahme auslöst. @breakfreehg

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X