带有弱引用的NSMutableDictionary:使用CFRetain作为回调时的警告

And*_*scu 1 cocoa default weak-references callback nsmutabledictionary

我正在尝试创建一个可变字典,它对值对象具有弱引用(键表现正常).这就是我试图这样做的方式:

+ (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];
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我得到一个警告(在不兼容的指针类型初始化声明keyCallbacks时),我已经跟踪它使用CFRetain和CFRelease.由于某些原因,这些回调与所需的原型不匹配(CFDictionaryRetainCallback和CFDictionaryReleaseCallback)

在文档中,它说示例CFDictionaryRetainCallback应该如下所示:

const void *MyCallBack (
   CFAllocatorRef allocator,
   const void *value
);
Run Code Online (Sandbox Code Playgroud)

但现有的CFRetain被宣布为

CFTypeRef CFRetain(CFTypeRef cf);
Run Code Online (Sandbox Code Playgroud)

它缺少allocator参数,这就是我认为编译器发出警告的原因:它不是函数签名中的完美匹配.

有没有人试图做这样的事情?

Jen*_*ton 5

不要那样做.使用NSMapTable.