1

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

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

过时的男孩

4

3 回答 3

2

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

要检查对象是否相等,您应该使用-isEqual:而不是==.

于 2010-01-28T09:37:59.493 回答
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));
于 2012-12-12T15:45:17.937 回答
1

NSDictionary is toll-free bridged with CFDictionary. So just do:

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

It's only the Cocoa method that copies the key.

于 2010-01-28T10:17:47.593 回答