使用MDQueryRef调用CFRelease EXC_BAD_ACCESS

时间:2014-07-18 13:14:38

标签: objective-c core-foundation

StringArray NativeSearch::search(const String &filenameglob) {

    CFStringRef queryString = jcf_getMDQueryString(filenameglob);

    MDQueryRef query;
    query = MDQueryCreate(kCFAllocatorDefault, queryString,
                          nullptr, nullptr);
    CFRelease(queryString);

    if (query == NULL) return StringArray();


    MDQueryExecute(query, kMDQuerySynchronous);

    int resultCount = MDQueryGetResultCount(query);
    StringArray result;

    for (CFIndex i = 0; i < resultCount; ++i) {
        const MDItemRef r = (const MDItemRef) MDQueryGetResultAtIndex(query, i);
        CFStringRef filename = (CFStringRef) MDItemCopyAttribute(r,
                                                                 CFSTR("kMDItemFSName"));
        DBG("found: " + String::fromCFString(filename));
        CFRelease(r);
        CFRelease(filename);
    }

    CFRelease(query);  // <<< EXC_BAD_ACCESS
    return result;
}

有关此问题的任何建议。我希望在查询上调用 CFRelease(),因为查询是使用MDQueryCreate创建的。 Apple文档表明,使用Create函数的结果是正确的。

然而我遇到了崩溃。否则代码按预期工作。

对此有什么想法吗?

1 个答案:

答案 0 :(得分:2)

问题解决了。

    CFRelease(r);

发布MDQuery实际拥有的MDItem。这是个错误。这意味着稍后,当我调用 CFRelease(查询)时,MDItem将被释放第二次。这会导致崩溃。

课程?

  • 调试时,我应该查看可能影响我的MDQuery的每个操作。相反,我只专注于直接命名查询对象的操作。
  • 不要 CFRelease(...)通过名为GetSomething的函数名获得的任何内容。

引用苹果:

  

Core Foundation函数的名称表明您拥有的时间   返回的对象:

     

在名称中嵌入“创建”的对象创建函数;

     

在名称中嵌入“复制”的对象复制功能。

     

如果   你拥有一个物体,你有责任放弃所有权   (完成后使用CFRelease)。

但是:不是当你通过一个名为Get的函数获得对象的引用时!