我正在开发的应用程序处理图像。用户最多可以拖放4张图片,应用程序会根据用户选择的模板对它们进行布局。一张图片可能在最终视图中被添加2-3次。
布局中的每个图像都是在NSView中绘制的(使用NSView的drawRect方法和drawInRect方法)。现在,通过将NSView保存为图像来创建最终图像(通过布局所有图像组合而成),这一切都运作得非常好。
现在我面临的问题是,在所有处理完成后应用程序仍然保留着内存。我已经使用了仪器分配,没有发现内存泄漏,但我看到“持久字节”随着每个应用程序会话不断增加,一个用户报告了几个GB的问题。请参见截图。
当我在仪器中进一步调查时,我看到下面的应用程序代码片段导致了内存保留。所有这些都与ImageIO和CoreImages有关。请参见下面的仪器内容:
然而,这似乎只是10.10及以上系统的问题。在10.9.x中测试了同一版本的应用程序,内存使用情况仍然在60MB以内。在应用程序的会话执行期间,它会增加到200MB,但一旦完成,它就会回到50-60MB,这对于这种类型的应用程序是很正常的。
上面的代码是我在NSView的drawRect方法中使用的,用于绘制图像,图像中显示的代码用于将NSView作为图像获取。
更新:经过进一步调查,我发现是CGImageSourceCreateWithData正在缓存NSImage的TIFF数据。此外,我正在使用以下代码裁剪图像,如果我取消注释它,内存消耗就会正常工作。
我还尝试着将 kCGImageSourceShouldCache 显式地设置为 false (但它默认就是 false),但结果相同。请帮忙解决内存保留的问题。
布局中的每个图像都是在NSView中绘制的(使用NSView的drawRect方法和drawInRect方法)。现在,通过将NSView保存为图像来创建最终图像(通过布局所有图像组合而成),这一切都运作得非常好。
现在我面临的问题是,在所有处理完成后应用程序仍然保留着内存。我已经使用了仪器分配,没有发现内存泄漏,但我看到“持久字节”随着每个应用程序会话不断增加,一个用户报告了几个GB的问题。请参见截图。
当我在仪器中进一步调查时,我看到下面的应用程序代码片段导致了内存保留。所有这些都与ImageIO和CoreImages有关。请参见下面的仪器内容:
然而,这似乎只是10.10及以上系统的问题。在10.9.x中测试了同一版本的应用程序,内存使用情况仍然在60MB以内。在应用程序的会话执行期间,它会增加到200MB,但一旦完成,它就会回到50-60MB,这对于这种类型的应用程序是很正常的。
[_photoImage drawInRect: self.bounds fromRect: NSZeroRect operation: NSCompositeSourceOver fraction: 1.0 respectFlipped: YES hints: nil];
_photoImage = nil;
上面的代码是我在NSView的drawRect方法中使用的,用于绘制图像,图像中显示的代码用于将NSView作为图像获取。
更新:经过进一步调查,我发现是CGImageSourceCreateWithData正在缓存NSImage的TIFF数据。此外,我正在使用以下代码裁剪图像,如果我取消注释它,内存消耗就会正常工作。
NSData *imgData = [imageToCrop TIFFRepresentation];
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)imgData, NULL);
CGImageRef maskRef = CGImageSourceCreateImageAtIndex(source, 0, NULL);
CGImageRef imageRef = CGImageCreateWithImageInRect(maskRef, rect);
NSImage *cropped = [[NSImage alloc] initWithCGImage: imageRef size:rect.size];
CGImageRelease(maskRef);
CGImageRelease(imageRef);
CFRelease(source);
//CFRelease( options );
imgData = nil;
我还尝试着将 kCGImageSourceShouldCache 显式地设置为 false (但它默认就是 false),但结果相同。请帮忙解决内存保留的问题。