NSMutableDictionaryのsetObject:forKey:とsetValue:forKey:の違いはどこですか?


153

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


回答:


163

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


その質問はまったく同じではありません。これはゲッターメソッドに関するものですが、この質問はセッターメソッドに関するものです
user102008

1
「NSMutableDictionaryでは、キーの前に '@'文字を付けない限り、ディクショナリエントリが変更されます。その場合、メンバー変数が変更されます。」どのメンバー変数ですか?また、多分あなたはstackoverflow.com/questions/5755917にコメントすることができますか?ありがとう。
PeterŠtibraný11年

完全を期すために、オブジェクトがnilの場合、setObject:forKeyは(例外)を発生させます。setValue:forKeyは同じように動作しますか、それともキーにnilを設定するときに辞書から既存のオブジェクトを削除しますか?
Motti Shneor 16年

すばらしい答えです。本当に。ただし、完全を期すために、(少なくともNSMutableDictionaryでは)setValue:forKey:はnil値を許容し、エントリを削除することに言及するとよいでしょう。一方、setObject:forKey:は例外をスローし、nil値を渡すとクラッシュします。
Motti Shneor

83

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


10
これは知っておくととても便利です。それ以外の場合は、NSMutableDictionaryに独自のカテゴリを作成して、これを正確に実現しました!。ありがとう
アーマン

2
もう1つの違いは、objective-cの添え字dic[key] = value;ですnil。値がの場合、キーの削除をサポートするように記述できます。添え字は一般に、setValue:forKey:これを達成するよりも優れたアプローチです。
・クール


4

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

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

value —キーの値。

key —値のキー。Key-Valueコーディングを使用する場合、キーは文字列である必要があります(「Key-Valueコーディングの基礎」を参照)。


setObject:forKey:が例外を発生させる通常の理由をお寄せいただきありがとうございます。@breakfreehg
simbesi.com
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.