155

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

4

4 に答える 4

165

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の違いは?

于 2009-08-08T19:09:45.047 に答える
86

もう 1 つの違いは、 nil 値をsetValue:forKey:に指定すると、キーが存在する場合はディクショナリから削除され、存在しない場合は何もしないことです。ただし、 に nil 値を指定するsetObject:forKey:と、例外が発生します。

于 2011-02-16T02:21:46.387 に答える
11

-setValue:forKey:-setObject:forKey:値が でない限り、レシーバーに送信するだけです。値が のnil場合は send-removeObjectForKeyです。

シンプル。

于 2016-09-02T09:55:06.577 に答える
4

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

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

value — キーの値。

key — 値のキー。キーと値のコーディングを使用する場合、キーは文字列でなければならないことに注意してください (「キーと値のコーディングの基礎」を参照)。

于 2011-02-17T12:00:10.457 に答える