使用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(),那么一切正常。
答案 0 :(得分:1)
使用retain回调,theArray会保留value参数 在创建阵列时提供。如果值不是类型 由保留回调预期,行为未定义。
所以看起来这是fileNames数组创建的问题。可能是CFArrayCreateMutable函数的第三个参数。由于CFString是CFType,尝试在那里传递kCFTypeArrayCallBack。