可以复制CFTypeRef吗?

时间:2014-12-29 19:27:35

标签: objective-c

我想创建以下功能:

CFDictionary* CFDictionary_create(CFTypeRef **keys, CFTypeRef **values, int count){
    return CFDictionaryCreate(NULL, (const void **)keys, (const void **)values, count, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
}

问题是键或值可能包含可变字符串(或其他可变对象),因此,我想将整个数组复制到不知道它们没有被更改。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

不,在一般情况下无法复制CFTypeRef

通常情况下,这是一个函数的调用者,以确保在字典中键不会发生变异。 (如果值发生变异,它不一定是个问题。例如,如果你有一个从名称到Person对象的字典映射,可以通过增加来修改Person个对象。他们的年龄或添加孩子等。如果你建立了一个设计要求,价值不会被改变,那么再次由调用者来决定是否符合这个要求。)

Cocoa的NSDictionary类只是强制要求所有密钥都符合NSCopying协议。传递一个在运行时不会导致错误的对象。您可以强制执行类似的要求,除非您要求所有CFType个对象都是免费桥接到符合NSCopying的类的类型。然后,您可以执行以下操作:

CFTypeRef new_keys[count];
for (int i = 0; i < count; i++)
{
    id<NSCopying> temp = (__bridge id<NSCopying>)keys[i];
    temp = [temp copy];
    new_keys[i] = CFBridgingRetain(temp);
}
CFDictionary* result = CFDictionaryCreate(NULL, (const void **)new_keys, (const void **)values, count, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
for (int i = 0; i < count; i++)
    CFRelease(new_keys[i]);
return result;