我正在使用过程映像的应用程序。这就像用户在最多4张图片上下载并根据用户选择的模板布局它们。最终视图中可能会添加一个图像2-3次。保留NSImage drawInRect和NSView cacheDisplayInRect内存
布局中的每个图像都在NSView中绘制(使用drawInRect方法的NSView的drawRect方法)。现在通过将NSView保存为Image来创建最终图像(通过布置所有图像的组合图像),并且一切运行良好。
现在我面临的问题是内存被所有处理完成后应用程序保留。我使用过仪器分配,并且没有看到内存泄漏,但是我看到“持续字节数”随着每次应用程序会议和一个用户报告的问题持续增加。请看截图。
当我在仪器进一步调查,我看到下面的应用程序代码的捕捉是导致内存保留期限。所有都与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),但相同的结果。 请帮助解决内存保留问题。
看起来我已经问过一些很容易理解或很难回答的问题。 :(请帮助,我真的卡住了。 –