2009-11-14 123 views
0

我有一個方法可以分析從CGImageRef構建的NSBitmapImageRep中的像素數據。下面是相關代碼:巨大的內存泄漏NSBitmapImageRep

CGImageRef ref; 
// omitted code for initializing ref 
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:ref]; 
uint32* bitmapPixels = (uint32*) [bitmapRep bitmapData]; 
// do stuff with bitmapPixels 
[bitmapRep release]; 
CGImageRelease(ref); 

我知道我在正確釋放CGImageRef和NSBitmapImageRep,但調用-bitmapData泄漏約2 MB每個這就是所謂的時間,我不知道如何正確地釋放它。有任何想法嗎?

更新:我忘了補充一點:內存只有在全屏應用程序運行時纔會泄漏。對於經常使用,內存釋放就好了。

+1

快速查看引用表明-bitMapData只是返回一個指向bitmapRep對象內的數據的指針,因此應該不需要釋放它。 你可以打開垃圾收集,看看會發生什麼嗎?它可能會給你一些線索。 – 2009-12-14 09:12:59

+0

@託尼·肯的解決方案似乎在你完成數據後發佈數據。沒有游泳池,看起來Mac只是在任何時候發佈數據。 – pop850 2011-05-07 21:41:09

回答

0

位圖數據應該由CGImage或NSBitmapImageRep擁有(或由後者複製到自動發佈的幕後NSData對象)。因此,無論哪個對象擁有(或複製)它應該釋放它。

你看到在堆/儀器中出現相反的結果嗎?

3

你在做循環?如果是這樣,您可能需要製作一個自動釋放池,以確保及時清理內存。見autorelease pools

+0

我有一個類似的問題,Nic問到的,這個解決方案是完美的。謝謝! – pop850 2011-05-07 21:36:14

+0

我正在循環播放圖像,有時一次有200 + 5MB + CIImages和NSBitmapImageReps,內存使用量最高將達到2-3 GB(加上系統會變得非常慢)。在環路周圍添加一個@autoreleasepool {}可以減少峯值內存使用量至〜180 MB,並使批處理過程花費幾秒鐘而不是1-2分鐘! – geerlingguy 2014-04-15 18:14:14