Apa perbedaan antara objectForKey
dan valueForKey
? Saya melihat keduanya dalam dokumentasi dan mereka tampak sama bagi saya.
sumber
Apa perbedaan antara objectForKey
dan valueForKey
? Saya melihat keduanya dalam dokumentasi dan mereka tampak sama bagi saya.
objectForKey:
adalah sebuah NSDictionary
metode. An NSDictionary
adalah kelas koleksi yang mirip dengan NSArray
, kecuali alih-alih menggunakan indeks, itu menggunakan kunci untuk membedakan antara item. Kunci adalah string acak yang Anda berikan. Tidak ada dua objek yang dapat memiliki kunci yang sama (sama seperti tidak ada dua objek dalam suatu NSArray
dapat memiliki indeks yang sama).
valueForKey:
adalah metode KVC. Ini bekerja dengan kelas APA SAJA. valueForKey:
memungkinkan Anda mengakses properti menggunakan string untuk namanya. Jadi misalnya, jika saya memiliki Account
kelas dengan properti accountNumber
, saya dapat melakukan hal berikut:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
Dengan menggunakan KVC, saya dapat mengakses properti secara dinamis:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
Itu adalah set pernyataan yang setara.
Saya tahu Anda berpikir: wow, tetapi dengan sarkastis. KVC tidak terlalu berguna. Bahkan, itu terlihat "bertele-tele". Tetapi ketika Anda ingin mengubah hal-hal saat runtime, Anda dapat melakukan banyak hal keren yang jauh lebih sulit dalam bahasa lain (tapi ini di luar ruang lingkup pertanyaan Anda).
Jika Anda ingin mempelajari lebih lanjut tentang KVC, ada banyak tutorial jika Anda Google terutama di blog Scott Stevenson . Anda juga dapat melihat Referensi Protokol NSKeyValueCoding .
Semoga itu bisa membantu.
Ketika Anda melakukannya,
valueForKey:
Anda perlu memberinya NSString, sedangkanobjectForKey:
dapat mengambil subkelas NSObject sebagai kunci. Ini karena untuk Pengodean Nilai-Kunci, kunci selalu berupa string.Bahkan, dokumentasi menyatakan bahwa bahkan ketika Anda memberikan
valueForKey:
NSString, iaobjectForKey:
tetap akan memohon kecuali jika string dimulai dengan@
, dalam hal ini ia memanggil[super valueForKey:]
, yang dapat memanggilvalueForUndefinedKey:
yang dapat menimbulkan pengecualian.sumber
Berikut adalah alasan yang bagus untuk digunakan
objectForKey:
sedapat mungkin alih-alihvalueForKey:
-valueForKey:
dengan kunci yang tidak dikenal akan membuang kataNSUnknownKeyException
"kelas ini tidak sesuai dengan kode kunci untuk kunci".sumber
Seperti yang dikatakan,
objectForKey:
tipe data adalah:(id)aKey
sedangkanvalueForKey:
tipe data:(NSString *)key
.Sebagai contoh:
Jadi,
valueForKey:
hanya akan mengambil nilai string dan merupakan metode KVC, sedangkanobjectForKey:
akan mengambil semua jenis objek.Nilai dalam
objectForKey
akan diakses oleh jenis objek yang sama.sumber
Saya akan mencoba memberikan jawaban yang komprehensif di sini. Sebagian besar poin muncul dalam jawaban lain, tetapi saya menemukan setiap jawaban tidak lengkap, dan beberapa salah.
Pertama dan terpenting,
objectForKey:
adalahNSDictionary
metode, sedangkanvalueForKey:
metode protokol KVC diperlukan dari setiap kelas keluhan KVC - termasuk NSDictionary.Selanjutnya, seperti @dreamlax menulis, petunjuk dokumentasi yang
NSDictionary
mengimplementasikan nyavalueForKey:
metode MENGGUNAKAN nyaobjectForKey:
implementasi. Dengan kata lain -[NSDictionary valueForKey:]
panggilan[NSDictionary objectForKey:]
.Ini menyiratkan, yang
valueForKey:
tidak pernah bisa lebih cepat daripadaobjectForKey:
(pada tombol input yang sama) meskipun pengujian menyeluruh yang telah saya lakukan menyiratkan sekitar 5% hingga 15% perbedaan, lebih dari miliaran akses acak ke NSDictionary yang sangat besar. Dalam situasi normal - perbedaannya dapat diabaikan.Berikutnya: Protokol KVC hanya berfungsi dengan
NSString *
kunci, karenanyavalueForKey:
hanya akan menerima kunciNSString *
(atau subkelas) sebagai kunci, sementaraNSDictionary
dapat bekerja dengan jenis objek lain sebagai kunci - sehingga "level bawah"objectForKey:
menerima objek apa pun yang dapat disalin (sesuai protokol NSCopying) sebagai kunci.Terakhir,
NSDictionary's
implementasi penyimpangan darivalueForKey:
perilaku standar yang didefinisikan dalam dokumentasi KVC, dan TIDAK akan memancarkanNSUnknownKeyException
untuk kunci yang tidak dapat ditemukan - kecuali ini adalah kunci "khusus" - yang dimulai dengan '@' - yang biasanya berarti " kunci fungsi agregasi (misalnya@"@sum, @"@avg"
). Sebagai gantinya, itu hanya akan mengembalikan nol ketika kunci tidak ditemukan di NSDictionary - berperilaku sama denganobjectForKey:
Berikut ini adalah beberapa kode uji untuk menunjukkan dan membuktikan catatan saya.
sumber