2013-05-16 63 views
0

我在使用Core Foundation Array時發現了一個奇怪的問題!這裏是代碼片段Corefoundation CFArray所有權

fname = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%s%s"), path, ep->d_name); 

CFArrayAppendValue(fileNames, fname); 
CFRelease(fname); <---- problem here 



cnt = CFArrayGetCount(fileNames); 
    for (i = 0; i < cnt; i++) { 
     fname = CFArrayGetValueAtIndex(fileNames, i); 
     if (fname) { 
      ptr = (char *)CFStringGetCStringPtr(fname, CFStringGetFastestEncoding(fname)); 

代碼在最後一行崩潰。如果我弄錯了,請糾正我。在創建CFStringRef後,我將它添加到CFArray中。根據我的理解,該對象現在由CFArray擁有。因此,我可以安全地刪除最初分配的CFStringRef。但是當我做CFRelease(fname);當我訪問代碼的第二部分中的數組元素時,代碼崩潰。有人可以解釋什麼是正確的做法嗎?如果我刪除CFRelease(),那麼一切正常。

回答

1

CFMutableArray Reference如說:

value參數是通過使用theArray theArray創建時提供的保留回調 保留。如果值不是保留回調期望的類型 ,則行爲是未定義的。

所以看起來像這是fileNames數組創建的問題。可能是CFArrayCreateMutable函數的第三個參數。由於CFString是CFType,因此嘗試在那裏傳遞kCFTypeArrayCallBacks。

+0

你說得對,就是這個問題。謝謝! – user2085689