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