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



我正在下载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)或通过TMCache的setObject: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倍。我怎样才能避免这种巨大的、可能造成严重后果的通货膨胀?这是一个图像,如果用户打开多个配置文件,每个配置文件都有一个缓存的图像怎么办?

图像尺寸对内存使用影响最大。对于给定的图像大小(无论PNG, JPG),内存使用几乎相同,并由:宽度x高度x 4字节给出。

3264x2448的封面图像将解码为大约32MB。也许原子写可以解释您看到的翻倍现象。

如果这是你需要处理的图像的大小,像这样的尖峰可能是不可避免的。重要的是要确保内存使用不会无限制地增长。当你运行应用并查看内存仪表时,它是否会随着应用的运行而下降?您还可以尝试将图像写入代码包装在@autoreleasepool中。

相关内容

  • 没有找到相关文章

最新更新