![](/img/trans.png)
[英]What's wrong with using a category on NSObject to provide a default protocol implementation?
[英]What's wrong with using NSObject's hash to create an NSMutableDictionary key?
在一些地方,我需要對象到對象的映射,並使用NSMutableDictionary作為查找表。 密鑰是盒裝的NSObject哈希,例如:
[dict setObject:newObject forKey:[NSNumber numberWithUnsignedInt:[keyObject hash]]];
其中keyObject是自定義類的實例,它按原樣繼承NSObject的 - (NSUInteger)哈希實現。 我在其他地方保留了對keyObject的引用,我可以用它來獲取newObject:
[dict objectForKey:[NSNumber numberWithUnsignedInt:[keyObject hash]]]
到目前為止,這似乎有效,盡管有關的應用還很年輕。
然而,Matt Gallagher寫到了這種方法:
這有點破壞了我的信心(因為這是一個iOS應用程序,我不能使用他建議的NSMapTable)。
任何人都可以指出以這種方式使用NSObject的哈希有什么問題,對於iOS應用程序的簡單對象 - 對象映射可能是更好的方法嗎?
哈希不保證是獨一無二的。
除了散列的非唯一性之外,如果你像在這里一樣將它們變成一個unsigned int
,你實際上保證即使是直接返回對象指針的-hash
方法也不一定會產生唯一的鍵。
如果你要做到這一點,那么,而不是使用NSNumber
,至少使用NSValue
與+valueWithPointer:
和-pointerValue
方法。
如果你真的想要一個NSDictionary
接口並且由於某種原因不能使用NSMapTable
,你可以使用Core Foundation來創建一個以原始對象指針為鍵的字典。 如果你這樣做,你甚至可以選擇內存管理如何適用於你在字典中用作鍵的對象; 例如,您可能想要保留密鑰,您可能想要復制密鑰,或者您可能認為您所關心的只是指針值本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.