簡體   English   中英

使用NSObject的哈希創建NSMutableDictionary密鑰有什么問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM