web-dev-qa-db-ja.com

NSMutableDictionaryのsetObject:forKey:とsetValue:forKey:の違いはどこにありますか?

ドキュメントを見ると、大きな違いはほとんどありません。 「値」と「オブジェクト」は両方ともタイプidですなので、どのオブジェクトでもかまいません。キーはかつて文字列であり、他の場合はIDです。それらの1つはオブジェクトを保持しているように見え、もう1つは保持していません。ほかに何か?どちらがどのような場合ですか?

152
HelloMoon

setValue:forKey:は、 NSKeyValueCoding プロトコルの一部です。これにより、とりわけ、Interface Builderなどのオブジェクトプロパティにアクセスできます。 setValue:forKey:は、NSDictionary以外のクラスで実装されます。

setObject:forKey:NSMutableDictionary's存在する理由です。その署名はたまたまsetValue:forKey:と非常に似ていますが、より一般的です(たとえば、任意のキータイプ)。署名が非常に似ていることは、偶然の一致です。

混乱を招くのは、NSMutableDictionaryのsetValue:forKey:の実装がほとんどの場合setObject:forKey:と同等であるということです。他のクラスでは、setValue:forKey:はメンバー変数を変更します。 NSMutableDictionaryでは、キーの前に「@」文字を付けない限り、ディクショナリエントリを変更します。この場合、メンバー変数を変更します。

したがって、簡単に言うと、辞書のキーと値を操作する必要がある場合はsetObject:forKey:を使用し、まれに取り組む必要がある場合はsetValue:forKey:を使用してください [〜#〜] kvp [〜#〜]

編集:そして、これは以前に尋ねられて答えられたように見えます: objectForKeyとvalueForKeyの違い?

163
Oren Trutner

別の違いは、setValue:forKey:にnil値を指定すると、キーが存在する場合は辞書からキーを削除し、それ以外の場合は何もしないということです。ただし、setObject:forKey:にnil値を指定すると、例外が発生します。

82
user102008

-setValue:forKey:単に送信-setObject:forKey:は、値がnilでない限り、受信者に送信します。その場合、-removeObjectForKey

とてもシンプル。

9
Jakub Truhlář

anObject —キーの値。オブジェクトは、NSDictionaryに追加される前に保持メッセージを受け取ります。この値はnilであってはなりません。

aKey —値のキー。キーがコピーされます(copyWithZone:;キーはNSCopyingプロトコルに準拠する必要があります)。キーはnilであってはなりません。

—キーの値。

key —値のキー。キーと値のコーディングを使用する場合、キーは文字列でなければなりません(「キーと値のコーディングの基礎」を参照)。

3
breakfreehg