2013-06-04 76 views
1

我在一個類的方法將以下代碼:CFMutableDataRef釋放,但仍使內存泄漏

CFMutableDataRef pixelData = CFDataCreateMutableCopy(0, 0, 
CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage))); 

UInt8 const *data = (UInt8 *)CFDataGetMutableBytePtr(pixelData); 
int pixelInfo = ((image.size.width * scale * point.y) + point.x) * 4; 
UInt8 alpha = data[pixelInfo + 3]; 
CFRelease(pixelData); 

當我做的XCode分析,它顯示了一個「的對象的潛在泄漏」在端部這種方法。由於我已經發布了pixelData,我不知道泄漏的位置。當我使用儀器時,我得到了由CGDataProviderCopyData引起的泄漏。正如我在別處讀到的,應該通過調用CFRelease(pixelData)來解決問題; 任何想法?

回答

3

您正在創建雙份副本。你不應該在這裏打電話CFDataCreateMutableCopy()CGDataProviderCopyData()已經爲你做了副本(正如其名稱所示)。

+0

我明白了,謝謝你。我之所以使用該副本的原因是因爲我使用tp get的訪問不良,這顯然是iOS 6上的一個常見問題。爲解決此問題,建議使用可變副本。 Thx,無論如何:) – mobearette

+1

確實,您需要創建一個可變副本才能調用'CFDataGetMutableBytePtr()',儘管在此代碼中,您可以在CFData上使用'CFDataGetBytePtr()',而不是創建' CFMutableData'。如果你真的需要一個可變副本,那麼你需要保留一個指向CGDataProviderCopyData()的結果的指針,這樣你可以在做一個可變副本之後釋放它(然後再釋放可變副本)。 –

3

由於您沒有存儲對CGDataProviderCopyData返回的數據的引用,因此您稍後無法發送釋放消息。

正如Rob指出的那樣,您的第二個副本不是必需的。

這應該工作,避免泄漏:

CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); 
UInt8 const* data = (UInt8*)CFDataGetBytePtr(pixelData);