ドキュメントを見ると、大きな違いはほとんどわかりません。「値」と「オブジェクト」はどちらもid型なので、どのオブジェクトでもかまいません。キーは文字列であり、その他の場合はIDです。それらの1つはオブジェクトを保持しているようで、もう1つは保持していません。ほかに何か?どっちがどっち?
ドキュメントを見ると、大きな違いはほとんどわかりません。「値」と「オブジェクト」はどちらも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の違い?
もう1つの違いは、nil値をsetValue:forKey:
に指定すると、キーが存在する場合はディクショナリからキーが削除され、それ以外の場合は何も行われません。ただし、nil値をsetObject:forKey:
に指定すると、例外が発生します。
dic[key] = value;
ですnil
。値がの場合、キーの削除をサポートするように記述できます。添え字は一般に、setValue:forKey:
これを達成するよりも優れたアプローチです。
-setValue:forKey:
-setObject:forKey:
値がnil
である場合を除き、受信者に送信するだけ-removeObjectForKey
です。
とてもシンプルです。
anObject —キーの値。オブジェクトは、に追加される前に保持メッセージを受け取りますNSDictionary
。この値はnilであってはなりません。
aKey —値のキー。キーがコピーされます(を使用してcopyWithZone:
、キーはNSCopying
プロトコルに準拠する必要があります)。キーはnilであってはなりません。
value —キーの値。
key —値のキー。Key-Valueコーディングを使用する場合、キーは文字列である必要があります(「Key-Valueコーディングの基礎」を参照)。