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函数的结果是正确的。
然而我遇到了崩溃。否则代码按预期工作。
对此有什么想法吗?
答案 0 :(得分:2)
问题解决了。
CFRelease(r);
发布MDQuery实际拥有的MDItem。这是个错误。这意味着稍后,当我调用 CFRelease(查询)时,MDItem将被释放第二次。这会导致崩溃。
课程?
引用苹果:
Core Foundation函数的名称表明您拥有的时间 返回的对象:
在名称中嵌入“创建”的对象创建函数;
在名称中嵌入“复制”的对象复制功能。
如果 你拥有一个物体,你有责任放弃所有权 (完成后使用CFRelease)。
但是:不是当你通过一个名为Get的函数获得对象的引用时!