我使用NSDictionary作为关联数组(即,我使用的键可以是任意对象)。关于NSDictionary的一个非常恼人的事情是它总是制作密钥的副本并存储它。在我的场景中,我稍后将从NSDictionary中检索密钥并对它们执行一些操作。该操作恰好取决于键的对象标识。因为我后来检索的密钥是我最初用作密钥的对象的副本。后面的对象标识检查失败。
我的问题是,iPhone 3.0 SDK中是否有任何类似哈希表的数据结构不能复制密钥?谢谢。
Outdateboy
答案 0 :(得分:2)
如果您不希望复制(甚至保留)密钥,可以使用CFDictionary
并提供kCFTypeDictionaryKeyCallbacks
或NULL
或自定义密钥回调。
要检查对象是否相等,您应使用-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));