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函数的结果进行处理是正确的。
但是我崩溃了。否则,代码将按预期工作。
对这个有什么想法吗?
问题解决了。
CFRelease(r);
正在释放MDQuery实际拥有的MDItem。这是个错误。这意味着稍后,当我调用CFRelease(query)时,MDItem将再次释放。这会导致崩溃。
上课?
引用苹果:
Core Foundation函数的名称指示您何时拥有返回的对象:
名称中嵌入了“创建”的对象创建函数;
名称复制中嵌入了“复制”的对象复制功能。
如果您拥有一个对象,则有责任在完成使用后放弃所有权(使用CFRelease)。
但是:当您通过名称中具有Get的函数获得对对象的引用时,则不是这样!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句