我正在尝试创建一个可变的字典,该字典对值对象具有弱引用(键行为正常)。
这就是我试图做到的方式:

+ (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/

10-09 16:55