Objective c CFRelease EXC_使用MDQueryRef调用时访问错误 StringArray NativeSearch::搜索(常量字符串和文件名glob){ CFStringRef queryString=jcf_getMDQueryString(filenameglob); MDQueryRef查询; query=MDQueryCreate(kcfolcatordefault、queryString、, nullptr,nullptr); cfr释放(queryString); if(query==NULL)返回StringArray(); MDQueryExecute(查询,kMDQuerySynchronous); int resultCount=MDQueryGetResultCount(查询); 字符串数组结果; 对于(CFIndex i=0;i

Objective c CFRelease EXC_使用MDQueryRef调用时访问错误 StringArray NativeSearch::搜索(常量字符串和文件名glob){ CFStringRef queryString=jcf_getMDQueryString(filenameglob); MDQueryRef查询; query=MDQueryCreate(kcfolcatordefault、queryString、, nullptr,nullptr); cfr释放(queryString); if(query==NULL)返回StringArray(); MDQueryExecute(查询,kMDQuerySynchronous); int resultCount=MDQueryGetResultCount(查询); 字符串数组结果; 对于(CFIndex i=0;i,objective-c,core-foundation,Objective C,Core Foundation,问题已解决 StringArray NativeSearch::search(const String &filenameglob) { CFStringRef queryString = jcf_getMDQueryString(filenameglob); MDQueryRef query; query = MDQueryCreate(kCFAllocatorDefault, queryString, n

问题已解决

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;
}
正在释放MDQuery实际拥有的MDItem。这是一个错误。这意味着稍后,当我调用CFRelease(query)时,MDItem将被第二次释放。这会导致崩溃

教训

  • 在调试时,我应该查看可能影响MDQuery的每个操作,而不是直接命名查询对象的操作
  • 不要释放(…)通过名为GetSomething的函数名获得的任何内容
引用苹果的话:

核心基础函数具有当您拥有一个 返回的对象:

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

在名称中嵌入“复制”的对象复制函数

如果 你拥有一件物品,放弃所有权是你的责任 (使用CFRelease)完成后

但是:不是当您通过名为Get的函数获取对对象的引用时

    CFRelease(r);