2009-09-23 33 views
1

我有一個NSMutableDictionary實例,我使用的鍵是NSNumber *類型。NSDictionary的objectForKey是查找引用還是基於值?

在場景中,我試圖用'objectForKey'來檢索我的字典中的一個對象,我知道它存在。但我一直得到零的結果,除非我把密鑰從NSNumber轉換爲NSString。

NSNumber *itemId = [NSNumber numberWithInt:5]; 

id *existingItem = [forRemovalLookup objectForKey:itemId]; 
if (existingItem == nil) 
{ 
    // expected: shouldn't be nil 
    NSLog(@"!!!!!Not expecting this to be nil"); 
} 

是否有另一個操作我應該用來測試字典中特定鍵的存在?

+1

我認爲你的意思是**'id' **而不是**'id *'**作爲你的數據類型。請記住,'id'大致等同於'void *',但更具動態性,並且不需要任何投射來存儲它。 (事實上​​,你有一個指向id的指針,在這種情況下仍然有效,但在語義上是錯誤的。) – 2009-09-24 04:07:02

+0

由於作者似乎發現錯誤,投票結束爲不再相關。 – 2009-10-19 05:07:36

回答

1

工作,但只有當[itemID hash]等於鍵的哈希值,如果[itemID isEqual:]時,針對問題的關鍵返回比較真實。我認爲NSNumber的哈希值就是它所保存的數字,但即使它只是一個相同數字的字符串表示形式,字符串的哈希值也會完全不同。從內存中,字符串的哈希值是通過將每個字符值乘以累加器的值乘以一定數量來計算的。

可能還有一些我很想念的東西,但在Cocoa郵件列表上有關於集合對象內部類行爲的討論,一般認爲如果一個類在集合中保持得很好,它應該正確返回-hash-isEqual:的體面值。

我知道這個答案在這種情況下並不能真正幫助你,但它可能會對字典集合在Cocoa中的工作方式有所幫助。

相關問題