ドキュメントを見ると、大きな違いはほとんどありません。 「値」と「オブジェクト」は両方ともタイプidですなので、どのオブジェクトでもかまいません。キーはかつて文字列であり、他の場合はIDです。それらの1つはオブジェクトを保持しているように見え、もう1つは保持していません。ほかに何か?どちらがどのような場合ですか?
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の違い?
別の違いは、setValue:forKey:
にnil値を指定すると、キーが存在する場合は辞書からキーを削除し、それ以外の場合は何もしないということです。ただし、setObject:forKey:
にnil値を指定すると、例外が発生します。
-setValue:forKey:
単に送信-setObject:forKey:
は、値がnil
でない限り、受信者に送信します。その場合、-removeObjectForKey
。
とてもシンプル。
anObject —キーの値。オブジェクトは、NSDictionary
に追加される前に保持メッセージを受け取ります。この値はnilであってはなりません。
aKey —値のキー。キーがコピーされます(copyWithZone:
;キーはNSCopying
プロトコルに準拠する必要があります)。キーはnilであってはなりません。
値 —キーの値。
key —値のキー。キーと値のコーディングを使用する場合、キーは文字列でなければなりません(「キーと値のコーディングの基礎」を参照)。