2014-07-18 60 views
1
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函數的結果是正確的。使用MDQueryRef調用CFRelease EXC_BAD_ACCESS

但是我得到一個崩潰。否則,代碼按預期工作。

對此有何看法?

回答

2

問題解決。

CFRelease(r); 

正在發佈實際上由MDQuery擁有的MDItem。這是個錯誤。這意味着稍後,當我撥打CFRelease(查詢)時,MDItem會再次發佈。這會導致崩潰。

課程?

  • 調試時,我應該看看每個可能影響我的MDQuery的操作。相反,我只關注直接命名查詢對象的操作。
  • 不要CFRelease(...)您通過名爲GetSomething的函數名獲得的任何東西。

引述蘋果:

核心基礎功能,具有指示當你擁有一個 返回對象名稱:

已經「創建」嵌入名字對象創建功能;

在名稱中嵌入「複製」的對象複製功能。

如果您擁有一個對象,則您有責任在完成所有權後放棄所有權 (使用CFRelease)。

但是:不是當您通過名稱中的Get獲取對象的引用!