Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否可以复制CFTypeRef?_Objective C - Fatal编程技术网

Objective c 是否可以复制CFTypeRef?

Objective c 是否可以复制CFTypeRef?,objective-c,Objective C,我想创建以下函数: CFDictionary* CFDictionary_create(CFTypeRef **keys, CFTypeRef **values, int count){ return CFDictionaryCreate(NULL, (const void **)keys, (const void **)values, count, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBa

我想创建以下函数:

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

问题是键或值可能包含可变字符串(或其他可变对象),因此,我希望将整个数组复制到garuntee,以确保它们不会更改。如何执行此操作?

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

通常,由此类函数的调用方来确保键在字典中没有发生变异。(如果一个值发生了变异,这不一定是个问题。例如,如果您有一个从名称到
Person
对象的字典映射,则可以通过增加年龄或添加子对象等方式修改
Person
对象。如果您建立了一个不发生变异的值的设计要求,那么它将再次取决于e调用方必须符合该要求。)

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;
CFTypeRef新_键[计数];
for(int i=0;i