Di mana perbedaan antara setObject: forKey: dan setValue: forKey: di NSMutableDictionary?

153

Ketika melihat dokumentasi, saya hampir tidak melihat perbedaan besar. Baik "nilai" dan "objek" bertipe id , jadi bisa berupa objek apa pun. Kunci pernah menjadi string, dan dalam hal lain id. Salah satu dari mereka tampaknya mempertahankan objek, dan yang lainnya tidak. Apa lagi? Yang mana untuk kasus apa?

EI Captain v2.0
sumber

Jawaban:

163

setValue:forKey:adalah bagian dari protokol NSKeyValueCoding , yang antara lain, memungkinkan Anda mengakses properti objek dari suka Interface Builder. setValue:forKey:diimplementasikan dalam kelas selain NSDictionary.

setObject:forKey:adalah NSMutableDictionary'salasan untuk ada. Tanda tangannya kebetulan sangat mirip dengan setValue: forKey :, tetapi lebih umum (misalnya semua jenis kunci). Agak kebetulan bahwa tandatangannya sangat mirip.

Apa yang menambah kebingungan adalah bahwa implementasi NSMutableDictionary setValue:forKey:setara dengan setObject:forKey:dalam kebanyakan kasus. Di kelas lain, setValue:forKey:perubahan variabel anggota. Di NSMutableDictionary, itu mengubah entri kamus, kecuali jika Anda awalan kunci dengan karakter '@' - dalam hal ini memodifikasi variabel anggota.

Jadi, singkatnya, gunakan setObject:forKey:ketika Anda perlu bekerja dengan kunci dan nilai kamus, dan setValue:forKey:dalam kasus yang lebih jarang di mana Anda perlu menangani KVP .

Sunting: dan oh, sepertinya ini telah ditanyakan dan dijawab sebelumnya: Perbedaan antara objectForKey dan valueForKey?

Oren Trutner
sumber
pertanyaan itu tidak persis sama. ini tentang metode pengambil, sedangkan pertanyaan ini tentang metode penyetel
user102008
1
Apa yang Anda maksud dengan "Dalam NSMutableDictionary, ia mengubah entri kamus, kecuali jika Anda awali kunci dengan karakter '@' - dalam hal ini memodifikasi variabel anggota." Apa variabel anggota? Mungkin Anda juga bisa mengomentari stackoverflow.com/questions/5755917 ? Terima kasih.
Peter Štibraný
hanya untuk kelengkapan, setObject: forKey akan memunculkan (pengecualian) jika objek nihil. Apakah setValue: forKey berperilaku sama, atau akankah menghapus objek yang ada dari kamus saat menetapkan nil untuk kunci?
Motti Shneor
Jawaban yang bagus Betulkah. untuk kelengkapan, akan lebih baik untuk menyebutkan bahwa (setidaknya pada NSMutableDictionary) setValue: forKey: mentolerir nilai nil, dan menghapus entri - sementara setObject: forKey: akan melempar pengecualian dan crash ketika menyerahkan nilai nil.
Motti Shneor
83

Perbedaan lainnya adalah bahwa jika Anda memberikan nilai nol setValue:forKey:, itu menghapus kunci dari kamus jika ada, jika tidak maka tidak ada artinya. Tetapi jika Anda memberikan nilai nol setObject:forKey:, itu menimbulkan pengecualian.

pengguna102008
sumber
10
Ini sangat berguna untuk diketahui. Saya telah menulis kategori saya sendiri di NSMutableDictionary untuk menyelesaikan ini !. Terima kasih
Arman
2
Perbedaan lainnya adalah dengan subskrip-c tujuan, Anda dapat menulis dic[key] = value;untuk mendukung penghapusan kunci jika nilainya nil. Berlangganan umumnya merupakan pendekatan yang lebih baik daripada setValue:forKey:melakukan hal ini.
Cœur
4

anObject - Nilai untuk kunci. Objek menerima pesan retain sebelum ditambahkan ke NSDictionary. Nilai ini tidak boleh nol.

aKey - Kunci untuk nilai. Kunci disalin (menggunakan copyWithZone:; kunci harus sesuai dengan NSCopyingprotokol). Kuncinya tidak boleh nol.

value - Nilai untuk kunci.

key - Kunci untuk nilai. Perhatikan bahwa saat menggunakan pengkodean nilai-kunci, kuncinya harus berupa string (lihat “Dasar-dasar Pengodean Nilai-Kunci”).

breakfreehg
sumber
Terima kasih telah memberikan alasan mengapa setObject: forKey: memunculkan pengecualian. @breakfreehg
simbesi.com