2014-03-28 57 views
3

我有一些代碼如下所示:真正的泄漏或虛假分析儀報告?

CFDictionaryRef myFunction() 
{ 
    CFIndex myNumberIndex = 1234; 
    CFNumberRef myNumber = NULL; 
    CFMutableDictionaryRef theDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, 0, 0); 

    myNumber = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &myNumberIndex); 
    CFDictionaryAddValue(theDict, kSomeKeyConstant, myNumber); 

    return theDict; 
} 

鐺靜態分析報告,myNumber是泄漏的對象。很明顯,因爲沒有電話給CFRelease()我傾向於理解這個問題,但我對CF一般不夠精通,所以我想驗證一下:myNumber需要在這裏發佈,即使它被添加到CFDictionary中回?那是......我正在給詞典添加一個有自己的保留/發佈需求的副本(在這種情況下,我需要在這裏發佈它)?我假設答案與字典創建時使用的kCFAllocatorDefault參數有關,但我沒有看到對象所有權的明確指示。

回答

3

是否myNumber需要在這裏發佈,即使它被添加到返回的CFDictionary?

是的,你需要釋放它。如果字典想要保留那個對象,它將會 - 字典用它做什麼不是你的問題。但是你創建了這個對象,所以你需要釋放它。

從調用myFunction()的函數的角度來看問題可能會有所幫助。 myFunction()返回一個CFDictionary。調用者是否應該在不再需要字典時發佈該字典中的每個對象?當然不是。但是如果調用者不這樣做,並且如果你不釋放myNumber,該對象將永遠不會被釋放,對吧?這是一個泄漏。

查看Core Foundation memory management rules的進一步解釋。其中一個例子的情況幾乎相同,並且顯示正在按要求執行發佈:

float myFloat = 10.523987; 
CFNumberRef myNumber = CFNumberCreate(kCFAllocatorDefault, 
            kCFNumberFloatType, &myFloat); 
CFMutableArrayRef myArray = CFArrayCreateMutable(kCFAllocatorDefault, 2, &kCFTypeArrayCallBacks); 
CFArrayAppendValue(myArray, myNumber); 
CFRelease(myNumber); 
+1

這非常有幫助;謝謝!希望您不介意我是否使用您提供的文檔鏈接中的相關材料編輯了答案。 – mah

+0

@mah很高興幫助,編輯看起來很好。 – Caleb