我正在下载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中。