1

我正在下载 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。但是,一旦我使用TMCache 的方法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 倍。我怎样才能避免这种大规模且可能造成严重后果的通货膨胀。这是一张图片,如果用户打开多个配置文件,每个配置文件都有一个缓存图像怎么办?

4

1 回答 1

1

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

3264x2448 的封面图像将解码为大约 32MB。也许原子写解释了你看到的加倍。

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

于 2014-07-28T16:35:47.350 回答