CGContextDrawImage泄漏

时间:2009-11-14 16:46:19

标签: objective-c cocoa macos core-graphics

我有一个使用以下方式绘制CGImage的自定义视图:

- (void) drawImage
{
    CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
    CGRect imageRect = {{0,0}, {CGImageGetWidth(image), CGImageGetHeight(image)}};
    CGContextDrawImage(context, imageRect, image);
}

在调整视图大小(因此重复调用drawImage)时,进程使用的内存看起来会稳定增加。 泄漏显示没有泄漏。 vmmap 确实显示内存增加,但是在我的应用程序直接控制范围之外的区域,即 CG光栅数据

REGION TYPE           [ VIRTUAL after open]     [VIRTUAL after X resizes]
===========           [ =======]
ATS (font support)    [   31.7M]                [   31.7M]
CG backing stores     [   2448K]                [   5400K]
CG image              [     12K]                [     12K]
CG raster data        [    872K]                [   18.3M] <-- memory increase

更换

CGContextRef context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];

CGContextRef context = (CGContextRef)[[NSGraphicsContext graphicsContextWithWindow:[self window]] graphicsPort];

使泄漏消失但导致窗口重绘速度变慢和视觉伪影。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

它似乎不是泄漏,您可能只是增加了缓存的大小。你说它达到峰值50Mb,似乎认为每个文档将是50Mb,但每个进程可能只有50Mb。

答案 1 :(得分:0)

不要轻视,但你真的有问题吗?泄漏很明显,18.3M对于CG栅格数据来说并不是很多。如果你将窗口调整到足够长的时间它会消耗所有可用的内存吗?你是怎么表现出来的?