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);