使用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/