我想创建以下功能:
CFDictionary* CFDictionary_create(CFTypeRef **keys, CFTypeRef **values, int count){
return CFDictionaryCreate(NULL, (const void **)keys, (const void **)values, count, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
}
问题是键或值可能包含可变字符串(或其他可变对象),因此,我想将整个数组复制到不知道它们没有被更改。我怎么能这样做?
答案 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;