一个不复制iPhone 3.0 SDK密钥的NSDictionary?

时间:2010-01-28 09:34:57

标签: cocoa hashtable key nsdictionary

我使用NSDictionary作为关联数组(即,我使用的键可以是任意对象)。关于NSDictionary的一个非常恼人的事情是它总是制作密钥的副本并存储它。在我的场景中,我稍后将从NSDictionary中检索密钥并对它们执行一些操作。该操作恰好取决于键的对象标识。因为我后来检索的密钥是我最初用作密钥的对象的副本。后面的对象标识检查失败。

我的问题是,iPhone 3.0 SDK中是否有任何类似哈希表的数据结构不能复制密钥?谢谢。

Outdateboy

3 个答案:

答案 0 :(得分:2)

如果您不希望复制(甚至保留)密钥,可以使用CFDictionary并提供kCFTypeDictionaryKeyCallbacksNULL或自定义密钥回调。

要检查对象是否相等,您应使用-isEqual:代替==

答案 1 :(得分:1)

NSDictionary与CFDictionary免费联网。所以就这样做:

CFDictionarySetValue((CFDictionaryRef)myMutableDict, key, object);

只有Cocoa方法才能复制密钥。

答案 2 :(得分:1)

我最近做了以下工作来实现一个不会复制它的密钥的MutableDictionary。

-(NSMutableDictionary*)mutableDictionaryWithRetainedKeys {
    CFMutableDictionaryRef dictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    return CFBridgingRelease(dictionary);
}

如果您的密钥不遵守NSCopying,并且您希望在设置密钥/值时避免使用编译器警告:

CFDictionarySetValue(dictionary, (__bridge const void *)(key), (__bridge const void *)(value));