我正在处理的应用程序图像。这就像用户最多放置 4 张图像,并根据用户选择的模板对它们进行应用布局。在最终视图中可能会添加 2-3 次图像。
布局中的每个图像都在 NSView 中绘制(使用 drawInRect 方法的 NSView 的 drawRect 方法)。现在通过将 NSView 保存为 Image 创建最终图像(通过布局所有图像来组合图像),并且一切正常。
现在我面临的问题是,一旦所有处理完成,应用程序就会保留内存。我使用了仪器分配,我没有看到内存泄漏,但我看到“持久字节”随着应用程序的每个会话而不断增加,并且一个用户报告了 GB 的问题。请看截图。
当我在 Instruments 中进一步调查时,我在下面看到导致内存保留的应用程序的代码快照。都与 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 作为图像。
更新:经过进一步调查,我发现缓存 NSImage 的 TIFF 数据的是CGImageSourceCreateWithData。我更多地使用下面的代码来裁剪图像,如果我取消注释它的内存消耗就可以正常工作。
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),但结果相同。请帮助解决内存保留问题。