我正在尝试创建一个可变的字典,该字典对值对象具有弱引用(键行为正常)。
这就是我试图做到的方式:
+ (id)mutableDictionaryUsingWeakReferencesWithCapacity:(NSUInteger)capacity
{
CFDictionaryKeyCallBacks keyCallbacks = {0, CFRetain, CFRelease, CFCopyDescription, CFEqual, CFHash};
CFDictionaryValueCallBacks valueCallbacks = {0, NULL, NULL, CFCopyDescription, CFEqual};
id<NSObject> obj = (id)(CFDictionaryCreateMutable(NULL, capacity, &keyCallbacks, &valueCallbacks));
return [obj autorelease];
}
不幸的是,在声明keyCallbacks时,我收到警告(从不兼容的指针类型初始化),并且我一直在追踪使用CFRetain和CFRelease的情况。由于某些原因,这些回调与所需的原型不匹配(CFDictionaryRetainCallback和CFDictionaryReleaseCallback)
在文档中说,示例CFDictionaryRetainCallback应该看起来像这样:
const void *MyCallBack (
CFAllocatorRef allocator,
const void *value
);
但是现有的CFRetain声明为
CFTypeRef CFRetain(CFTypeRef cf);
它缺少分配器参数,这就是为什么我认为编译器会给出警告:这不是函数签名中的完美匹配。
有没有人尝试做这样的事情?
最佳答案
如果您只想要默认的CFRetain
/ CFRelease
行为,则应该可以使用:
void MONDictionaryReleaseCallback(CFAllocatorRef allocator, const void* value) {
#pragma unused(allocator)
assert(value);
if (0 != value) {
CFRelease(value);
}
}
保留回调应该很容易从那里实现。
关于cocoa - 带有弱引用的NSMutableDictionary:使用CFRetain作为回调时的警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4868034/