NS (Mutable) sözlüklerinde anahtar olarak kullanılan tüm nesneler, NSCopying protokolünü desteklemeli ve söz konusu nesneler sözlükte kullanıldığında kopyalanmalıdır.Cocoa's NSDictionary: Anahtarlar neden kopyalanıyor?
Sıklıkla bir nesneyi diğerine eşlemek için, daha ağır nesneleri anahtar olarak kullanmak isterim. Ne Bunu yaparken gerçekten demek etkin bir geçerli:
[dictionary setObject:someObject forKey:[NSValue valueWithPointer:keyObject]];
("Geri gelip tekrar bu aynı anahtar nesne örneğini teslim ederken, aynı değere çıkar beni.")
... Bu tasarım etrafında bazen yapmak için yaptığım şey tam olarak bu. (Evet, masaüstü Cocoa NSMapTable hakkında bilmek; ama örneğin iPhone bu desteklemez.)
Ama Bana düşmez gerçekten anahtar ilk etapta gerekli veya arzu edilir kopyalama neden olsun olduğunu. Uygulamayı veya arayanı ne alır?
Dirk: Bunun için teşekkürler. Yanlış anlama olduğum kritik gerçeğin (cevabın beni yönlendirdiğini), anahtarın semantiğinin anahtar nesne ref * ile ilgili olmadığını *; anahtarın içeriği ile ilgilidirler (böylece anahtar "foo" dizgesidir, ister harflerden, isterse neyse), bir literalden oluşur - bu, semantik bir karşılaştırmayı işaret eder, bir işaretçi değil. Ancak, tuşlar * sonra * kopyalanmalıdır, çünkü değiştirilebilir tuşlar değişebilir. Bu durum beni nereye bıraktığında, gerçekten bir anahtar için bir nesneyi kullanmak istediğimde ve referans eşitliğinden çok sonra, benim yaklaşımım bir kırılma değil; tam olarak doğru. –
Ben: Oldukça değil. 'KeyObject''ün korunmasını istiyorsanız, bu kod bunu yapmayacaktır, çünkü keyObject’i bir nesneye değil, bir nesneye bir işaretçi olarak gösterdiği için, onu tutabileceğini bilmenin bir yolu yoktur. Ben emin değilim: withObjCType: '@encode (id)' geçse bile, koruyacaktır. Anahtarlarınızı elde ettiğinden kesinlikle emin olmak için, ya NSMapTable'ı kullanmanız gerekecek (iPhone için geliştirdiğiniz için bunu yapamayacağınızı ima ediyorsunuz), NSDictionary yerine CFDictionary kullanın (her yerde sadece kendi yaratımı sırasında) veya kendi NSValue alt sınıfınızı oluşturun. –
İyi nokta. Ekstra bilgi için teşekkürler. Bunu düşündüğümde, bu modeli kullandığımda saklanacak anahtarlara asla ihtiyacım yok. Genellikle bazı diğer koleksiyonlar aslında anahtar olarak kullandığım nesneleri "sahiplenir"; Ben sadece onları diğer ilgili nesneye verimli bir şekilde eşlemek için sözlük kullanıyorum. En kötü durum, anahtar nesnenin, sözlükte bir türkçe giriş bırakarak dealloc olacağıdır. Dikkatli olmak zorunda olduğum tek şey, gerçek anahtarları sıralamak ve işaretçileri tekrar id olarak göstermektir. Ama bu kod, tehlikeli bir şey yaptığını bilmek için yeterince kötü kokuyor ... –