我有一个使用以下方式绘制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];
使泄漏消失但导致窗口重绘速度变慢和视觉伪影。
我该如何解决这个问题?
答案 0 :(得分:1)
它似乎不是泄漏,您可能只是增加了缓存的大小。你说它达到峰值50Mb,似乎认为每个文档将是50Mb,但每个进程可能只有50Mb。
答案 1 :(得分:0)
不要轻视,但你真的有问题吗?泄漏很明显,18.3M对于CG栅格数据来说并不是很多。如果你将窗口调整到足够长的时间它会消耗所有可用的内存吗?你是怎么表现出来的?