2010-08-03 69 views
0

我不熟悉C.我有其他人創建了一種方法,有一個是這樣的iphone - 釋放一個CFDictionary

touchBeginPoints = CFDictionaryCreateMutable(NULL, 0, NULL, NULL); 

point = (CGPoint *)malloc(sizeof(CGPoint)); 
CFDictionarySetValue(touchBeginPoints, touch, point); 

我想dealloc的字典現在創建了一個CFDicionary。據我所知,我必須逐字逐一閱讀字典中有多少個條目,並且每個條目都是免費的。

 free((void *)CFDictionaryGetValue(touchBeginPoints, ...)); 
     CFDictionaryRemoveValue(touchBeginPoints, ...); 

所以,我怎麼遍歷通過這個CFDictionary釋放儲存在那裏的每個點,並刪除每個字典詞條?

感謝您的任何幫助。

回答

3

你不知道。

您閱讀此頁:http://developer.apple.com/mac/library/documentation/CoreFoundation/Reference/CFDictionaryRef/Reference/reference.html#//apple_ref/doc/c_ref/CFDictionaryValueCallBacks

你認識到,默認情況下,標準的字典將調用CFRetain()扶住你通過它的價值,CFRelease()來放開它。你認爲「......但是CFRetain()不適合被稱爲CGPoint」。你意識到所有那些告訴你剛剛發佈字典的人最多都會漏水,最糟糕的時候會崩潰。

然後,您可以創建一個這樣的結構:

CFDictionaryValueCallBacks myValueCallbacks = { 
    0, 
    NULL, 
    myRelease, 
    NULL, 
    NULL 
}; 

和創建字典(最後一個參數)傳遞時,作爲valueCallbacks參數。 myRelease函數應該如下所示:

void myRelease (CFAllocatorRef allocator, const void *value) 
{ 
    free(value); 
} 

現在,只要字典發佈值,它就會爲你調用free()。

說了這麼多,如果你是C的新手,這不是開始的地方。

+0

我明白你是對的。我試圖實現你所說的,我從編譯器收到錯誤。例如,在我看到的免費(價值)行上(「警告:將'free'的參數1從指針目標類型中丟棄限定符」)。那麼,您能否告訴我如何添加和刪除此字典中的對象,以及如何在實施您的方法後發佈字典?請爲我的案件專門編碼,因爲我沒有辦法在C中推斷僞代碼並適用於我的案例......我完全不在C中。 – SpaceDog 2010-08-04 06:18:01

+1

要消除警告,只需將free(value)更改爲free((void *)value)即可​​。 一旦你使用這個valueCallback,你可以使用CFRelease(touchBeginPoints)來釋放字典,就像@rastersze建議的那樣。 您不需要遍歷字典的內容。從字典中刪除一個對象現在將釋放它。請注意,對於其他應用程序來說,這是否是件好事是不可能的。猜測,你在這裏複製Erica Sadun,這對嘗試一個noob不是一件好事。 – Jeff 2010-08-05 01:08:24

+0

我知道,但埃裏卡的例子只是坐在那裏做一個我想做的事,而且我永遠不需要修改。她在C和C中做了很多事情,並且C融化了我的大腦。我總是試圖將所有東西從C/C++轉換爲Objective-C,但首先我必須瞭解所做的事情。過去我成功地完成了這個任務,但是這本字典的東西讓我很難過。謝謝! – SpaceDog 2010-08-05 09:39:57

0

您可以使用CFDictionary和NSDictionary中之間的Objective-C的免費橋接,如果你想:

[(id)touchBeginPoints release]