2011-05-18 19 views
3

在一些地方我需要對象到對象的映射,並使用NSMutableDictionary作爲查找表。關鍵一直是盒裝NSObject的哈希值,例如:使用NSObject的哈希來創建一個NSMutableDictionary鍵有什麼問題?

[dict setObject:newObject forKey:[NSNumber numberWithUnsignedInt:[keyObject hash]]]; 

其中keyObject是一個自定義類,它繼承了NSObject中的實例 - (NSUInteger)哈希實現原樣。我都保留引用到別的地方keyObject,我可以用它來獲得NEWOBJECT的持有正是如此:

[dict objectForKey:[NSNumber numberWithUnsignedInt:[keyObject hash]]] 

這似乎工作至今,雖然有關的應用程序還年幼。

馬特·加拉格爾,但是,寫關於這個方法:

(don't laugh, I've seen it done)

稍微破壞了我的信心(和,因爲這是一個iOS應用,我不能用他的建議的NSMapTable) 。

任何人都可以指出以這種方式使用NSObject的散列有什麼問題,以及對於iOS應用程序的簡單對象 - 對象映射有什麼更好的方法?

回答

2

除了散列的非唯一性,如果你硬塞他們到unsigned int,你在這裏做,你實際上已經保證,即使是-hash方法返回的對象的指針直接不一定會導致一個獨特的鍵。

如果你打算這樣做,那麼,而不是使用NSNumber,至少使用NSValue+valueWithPointer:-pointerValue方法。

如果你真的想要一個NSDictionary接口,並且出於某種原因不能使用NSMapTable,則可以使用Core Foundation來創建一個包含原始對象指針作爲其鍵的字典。如果你這樣做,你甚至可以選擇內存管理如何用於字典中用作鍵的對象;例如,您可能需要保留密鑰,您可能需要複製密鑰,或者您可能決定所關心的只是指針值本身。

+1

「鞋拔」?在iOS上,'sizeof(NSUInteger)== sizeof(unsigned int)'。 – 2011-05-18 17:57:34

+0

@Josh Caswell:'在iOS上,sizeof(NSUInteger)== sizeof(unsigned int)'雖然這可能是真的,但'valueVithPointer:'狀態意圖沒有'NSValue'更清楚嗎? – dawg 2011-05-18 20:33:55

+0

@drewk:我認爲使用地址是正確的路要走,'+ [NSValue valueWithPointer:]'是一個很好的方法。我只是想指出,alastair的答案似乎不正確地指OS X. – 2011-05-18 20:44:32

2

哈希不保證是唯一的。

+0

我想,NSObject的默認實現只是返回它的內存位置。在實例的生命週期中,應該足以指定實例相等。 – Cris 2011-05-18 02:30:08

+2

如果您直接使用對象的內存位置,該怎麼辦?那麼,如果其他人實現了不同的「哈希」方法,也無關緊要。 – 2011-05-18 02:51:17

+0

是的,我可以做到這一點。但無論哪種方式,這正是MG在我所鏈接的職位上所嘲笑的。他清楚地看到了以這種方式使用盒裝內存地址作爲關鍵字的錯誤(或者至少是有趣的),我想知道爲什麼。還有什麼會更好的方法假裝obj c中的關聯數組。 – Cris 2011-05-18 03:45:58