SetObject: forKey: ve setValue: forKey: in NSMutableDictionary arasındaki fark nerede?


153

Belgelere baktığımda büyük bir fark görmüyorum. Hem "değer" hem de "nesne" id türündedir , bu nedenle herhangi bir nesne olabilir. Anahtar bir zamanlar dize, diğer durumda bir kimliktir. Bunlardan biri nesneyi koruyor, diğeri tutmuyor. Başka? Hangisi hangi dava için?


Yanıtlar:


163

setValue:forKey:Diğer şeylerin yanı sıra, Arayüz Oluşturucu'nun beğenilerinden nesne özelliklerine erişmenizi sağlayan NSKeyValueCoding protokolünün bir parçasıdır . setValue:forKey:dışındaki sınıflarda uygulanır NSDictionary.

setObject:forKey:olduğunu NSMutableDictionary'svarolmaya sebep. İmzası setValue: forKey: ile oldukça benzerdir, ancak daha geneldir (örneğin, herhangi bir anahtar türü). İmzaların çok benzer olması bir tesadüf.

Karışıklıklara ek olarak, NSMutableDictionary uygulamasının çoğu durumda setValue:forKey:eşdeğer olmasıdır setObject:forKey:. Diğer sınıflarda setValue:forKey:üye değişkenleri değiştirir. Gelen NSMutableDictionarybir '@' karakteri ile anahtar önüne belirtilmediği sürece bu sözlüğe giriş değiştirir - bu durumda o üye değişkenleri değiştirir.

Yani, kısaca, kullanımda setObject:forKey:tüm sözlük anahtarlarını ve değerlerle işe gerekir ve ne zaman setValue:forKey:sen mücadele için gereken nadir durumlarda KVP .

EDIT: ve oh, daha önce sorulmuş ve cevaplanmış gibi görünüyor: objectForKey ve valueForKey arasındaki fark?


bu soru tam olarak aynı değil. alıcı yöntemleri hakkında, bu soru ayarlayıcı yöntemleri hakkında
user102008

1
Ne demek istiyorsun "NSMutableDictionary, eğer anahtar '@' karakteri ile önek - bu durumda üye değişkenleri değiştirir" sürece sözlük girişlerini değiştirir. Hangi üye değişkenleri? Ayrıca belki stackoverflow.com/questions/5755917 hakkında yorum yapabilirsiniz ? Teşekkürler.
Peter Štibraný

sadece bütünlük için setObject: nesne nil ise forKey yükselir (istisna). SetValue: forKey aynı şekilde davranacak mı yoksa anahtar için nil ayarlanırken varolan nesneyi sözlükten kaldıracak mı?
Motti Shneor

Mükemmel cevap. Gerçekten mi. ancak tamlık için, (en azından NSMutableDictionary'de) setValue: forKey: nil değerlerini tolere eder ve girdiyi kaldırır - setObject: forKey: nil değerleri verildiğinde istisna ve çökme atacaktır.
Motti Shneor

83

Başka bir fark, eğer bir nil değeri verirseniz setValue:forKey:, anahtarı varsa sözlükten kaldırır, aksi takdirde hiçbir şey yapmaz. Fakat setObject:forKey:buna sıfır değer verirseniz , bu bir istisna oluşturur.


10
Bunu bilmek çok faydalı. Aksi takdirde tam olarak bunu başarmak için NSMutableDictionary kendi kategorimi yazmıştı !. Teşekkürler
Arman

2
Başka bir fark objektif-c aboneliği ile, dic[key] = value;değer ise anahtarın kaldırılmasını desteklemek için yazabilirsiniz nil. Abonelik genellikle bunu yapmaktan daha iyi bir yaklaşımdır setValue:forKey:.
Cur


4

anObject - Anahtarın değeri. Nesne, öğesine eklenmeden önce bir saklama iletisi alır NSDictionary. Bu değer sıfır olmamalıdır.

aKey - Değer anahtarı. Anahtar kopyalanır ( copyWithZone:; tuşları NSCopyingprotokolle uyumlu olmalıdır ). Anahtar sıfır olmamalıdır.

value - Anahtarın değeri.

tuşu - Değer anahtarı. Anahtar / değer kodlaması kullanılırken anahtarın bir dize olması gerektiğini unutmayın (bkz. “Anahtar / Değer Kodlama Esasları”).


SetObject: forKey: bir istisna yaratıyor olmanızın gerçek nedenini verdiğiniz için teşekkür ederiz. @breakfreehg
simbesi.com
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.