为什么将UIImages保存到磁盘会增加内存使用量

时间:2014-07-18 18:11:47

标签: uiimage nsdata writetofile uiimagepngrepresentation

我正在下载App.net用户上传的封面图片。 App.net要求这些封面图像的宽度至少为960像素。我用一个简单的AFImageRequestOperation

来获取它们
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:URL];
AFImageRequestOperation *imageRequestOperation = [AFImageRequestOperation imageRequestOperationWithRequest:urlRequest success:^(UIImage *image) {
    if (completionHandler) {
        completionHandler(image); // Load image into UI...
    }
}];
[self.fetchQueue addOperation:imageRequestOperation];

这很有效,没有内存峰值。

我想缓存经过身份验证的用户的图片,以便用户不必在每次打开应用时下载它们。一旦我将下载的图像存档到磁盘,我就会在内存中出现巨大的峰值。例如,我的封面图片目前是3264 x 2448像素。在我的Mac上下载时,大约需要1,3 MB。但是,只要我使用UIImagePNGRepresentation(image)TMCachesetObject:forKey:方法创建NSData对象,应用程序使用的内存峰值就会达到大约60,0 MB。

为清楚起见,这就是我要把文件写入磁盘的全部内容:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    NSURL *fileURL = ... //  URL of file in "/Application Support" 
    NSData *imageData = UIImagePNGRepresentation(imageToSave);
    [imageData writeToURL:fileURL atomically:YES];
});

谁能告诉我发生了什么事?为什么将1,3 MB推断为差不多60倍。我怎样才能避免这种大规模且可能严重的通货膨胀。这是一个图像,如果用户打开多个配置文件,每个配置文件都有缓存图像,该怎么办?

1 个答案:

答案 0 :(得分:1)

图像尺寸对内存使用的影响最大。对于给定的图像大小(无论PNG,JPG如何),内存使用情况几乎相同,由下式给出:width x height x 4 bytes。

3264x2448的封面图片将解码为大约32MB。原子写作可能解释了你看到的翻倍。

如果这是您需要使用的图像大小,这样的尖峰可能是不可避免的。重要的是要确保内存使用量不会无限增长。当您运行应用程序并查看内存仪器仪表时,它最终会因为您的应用程序的工作而停止运行吗?您还可以尝试将图像编写代码包装在@autoreleasepool中。