使用Core Foundation Array时发现一个奇怪的问题!这是代码片段

fname = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%s%s"), path, ep->d_name);

CFArrayAppendValue(fileNames, fname);
CFRelease(fname); <---- problem here



cnt = CFArrayGetCount(fileNames);
    for (i = 0; i < cnt; i++) {
        fname = CFArrayGetValueAtIndex(fileNames, i);
        if (fname) {
            ptr = (char *)CFStringGetCStringPtr(fname, CFStringGetFastestEncoding(fname));


代码在最后一行崩溃。如果我弄错了,请纠正我。创建CFStringRef之后,将其添加到CFArray。根据我的理解,该对象现在归CFArray所有。因此,我可以安全地删除我最初分配的CFStringRef。但是当我做CFRelease(fname);当我访问代码第二部分中的数组元素时,代码崩溃。有人可以解释什么是正确的方法吗?如果我删除了CFRelease(),那么一切都会正常。

最佳答案

正如CFMutableArray Reference所说:


  value参数由theArray使用保留回调保留
  在创建theArray时提供。如果值不是该类型
  由保留回调预期,行为未定义。


因此,看起来这是fileNames数组创建的问题。可能是CFArrayCreateMutable函数的第三个参数。由于CFString是CFType,请尝试在此处传递kCFTypeArrayCallBacks。

关于objective-c - Corefoundation CFArray所有权,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16579083/

10-10 22:37