【问题标题】:Corefoundation CFArray ownershipCorefoundation CFArray 所有权
【发布时间】:2013-05-16 04:36:46
【问题描述】:

我在使用Core Foundation Array时发现了一个奇怪的问题!这是代码sn-p

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() 则一切正常。

【问题讨论】:

    标签: objective-c c macos core-foundation


    【解决方案1】:

    正如CFMutableArray Reference 所说:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 2011-10-14
      • 1970-01-01
      相关资源
      最近更新 更多