2009-11-14 126 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