0

我在使用 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() 那么一切正常。

4

1 回答 1

1

正如CFMutableArray 参考所说:

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

所以看起来这是 fileNames 数组创建的问题。可能是 CFArrayCreateMutable 函数的第三个参数。由于 CFString 是一个 CFType 尝试在那里传递 kCFTypeArrayCallBacks 。

于 2013-05-16T05:52:34.213 回答