我正在下载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倍。我怎样才能避免这种大规模且可能严重的通货膨胀。这是一个图像,如果用户打开多个配置文件,每个配置文件都有缓存图像,该怎么办?
答案 0 :(得分:1)
图像尺寸对内存使用的影响最大。对于给定的图像大小(无论PNG,JPG如何),内存使用情况几乎相同,由下式给出:width x height x 4 bytes。
3264x2448的封面图片将解码为大约32MB。原子写作可能解释了你看到的翻倍。
如果这是您需要使用的图像大小,这样的尖峰可能是不可避免的。重要的是要确保内存使用量不会无限增长。当您运行应用程序并查看内存仪器仪表时,它最终会因为您的应用程序的工作而停止运行吗?您还可以尝试将图像编写代码包装在@autoreleasepool中。