我正在尝试使用至少两种方法为 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 的字典。问题是:对于这种情况,这些有效的回调吗?除此之外,我的代码还有什么问题吗?