我正在尝试用至少两种方法来实现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的字典。问题是:对于这种情况,这些回调有效吗?除此之外,我的代码有什么问题吗?
发布于 2011-01-30 03:41:53
我不认为这些回调本身有什么问题。也就是说,您应该小心地将NSMutableDictionaries分发给不像普通NSMutableDictionaries的“公众”。
要详细说明,给某人一个NSMutableDictionary指针是在隐式地声明对象的行为。将其设置为一个CFMutableDictionary,使用非标准回调,并使用Toll桥接编译的魔力进行转换,但它正在为失败设置使用者。
更一般说来,我想说你可以不受惩罚地做这件事,只要你把字典保密给任何类别的人。您的代码片段意味着您可能会以NSMutableDictionary的名义将其分发给“世界的其他部分”,而实际上并非如此。
如果您需要分发这些实例,我建议您创建自己的自定义NSMutableDictionary子类,如"MyWeakRefKeyMutableDictionary“,并显式地返回该类型。然后,至少如果有人把它当作一个NSMutableDictionary,他们不能说他们没有被警告。
发布于 2012-06-13 09:32:16
,当我还没有找到保存和释放键的标准核心基础回调时,我就不得不自己写这些。
我想你在找CFRetain和CFRelease。但是,如果您只想更改键回调,可以使用标准的kCFTypeDictionaryValueCallBacks。
+ (NSMutableDictionary *)dictionaryWithWeakReferencedKeysForCapacity: (NSUInteger)capacity
{
CFDictionaryKeyCallBacks keyCallbacks = { 0, NULL, NULL, CFCopyDescription, CFEqual, NULL };
return [(id)CFDictionaryCreateMutable(NULL, capacity, &keyCallbacks, &kCFTypeDictionaryValueCallBacks) autorelease];
}https://stackoverflow.com/questions/4839352
复制相似问题