我正在尝试为NSMutableDictionary类实现分类,其中至少有两种方法:一种是对NSDictionary进行保留(不是复制)其键的操作,另一种是对NSDictionary进行弱引用(即不对其进行任何操作)。
第二个方法(对于保留键)看起来很相似,这里不再介绍。 代码内部的可怕功能有:
在这两种情况下,值都会被简单地保留。
因此,由于据说CFDictionaryRef与NSDictionary之间存在无缝桥接,我实际上执行以下操作:
+ (NSMutableDictionary *)dictionaryWithWeakReferencedKeysForCapacity: (NSUInteger)capacity
{
CFDictionaryKeyCallBacks keyCallbacks = { 0, NULL, NULL, CFCopyDescription, CFEqual, NULL };
CFDictionaryValueCallBacks valueCallbacks = { 0, ___f_KBWS_DICTIONARY_RETAIN_CALLBACK, ___f_KBWS_DICTIONARY_RELEASE_CALLBACK, CFCopyDescription, CFEqual };
return [(id)CFDictionaryCreateMutable(NULL, capacity, &keyCallbacks, &valueCallbacks) autorelease];
}
第二个方法(对于保留键)看起来很相似,这里不再介绍。 代码内部的可怕功能有:
static const void *___f_KBWS_DICTIONARY_RETAIN_CALLBACK(CFAllocatorRef allocator, const void *value)
{
id object = (id)value;
return [object retain];
};
static void ___f_KBWS_DICTIONARY_RELEASE_CALLBACK(CFAllocatorRef allocator, const void *value)
{
id object = (id)value;
return [object release];
};
因为我没有找到标准的核心基础回调来保留和释放键,所以我不得不自己编写这些。
我计划使用这些类别来存储仅子类NSObjects的字典。 问题是:这些回调对于此情况是否有效? 除此之外,我的代码还有什么问题吗?
+ (NSMutableDictionary *)kbws_dictionaryWithWeakReferencedKeysForCapacity:(NSUInteger)capacity
。另外,通常你也会想要提供哈希回调函数。哈希码对于CFDictionaries非常重要 - 在大多数情况下,最好提供此功能,因为它可以给出预期的结果。如果你不提供哈希回调函数,则哈希码基于地址(这在某些情况下是有效的行为)。 - justin