2011-05-18 14 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

相关问题