我正在观看WWDC 2010视频,该视频涉及高级内存分析(会话311 ):
在视频的大约45:00,性能工程师讨论如何处理" Resident Dirty memory"您的应用已加载到RAM中。工程师建议,为了响应内存警告,您的应用应清除此信息。工程师在他的定制课程中粘贴" flush"方法进入didReceiveMemoryWarning
,一切都很好,但代码并没有提供任何如何释放内存的例子。
我的问题是 - 如何清除"图像IO"?所使用的大块脏内存:
这里有大约74 MB的内存,只是坐在脏兮兮的地方(现在接近6分钟),等待有人将其返回到iOS6。什么都没发生。由于它不会自行消失,我需要知道如何将其返回iOS。
这些块似乎来自这样的代码和(可能是其他与图像相关的操作)。
UIImage *screenshot = nil;
@autoreleasepool {
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(iPhoneRetinaIconSize, NO, [UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext(iPhoneRetinaIconSize);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
问题是存在大量内存,加载到RAM中,在应用崩溃之前无法返回操作系统。
对于与webview相关的脏内存,我发现这可能有效:
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
// Dispose of any resources that can be recreated.
}
是否有UIImage,CALayer或UIGraphics的等价物?
答案 0 :(得分:1)
我不是这些问题的专家,但基于我使用您提供的代码进行的测试,我要说您只需要释放在这些代码块中创建的UIImage
。 / p>
据我了解,Image IO
或GC raster data
标记的内存块实际上只是图片的基础数据(UIImage
是UIKit
封装在上面这些)。因此,要释放内存,请释放图像。
我通过使用您的代码创建了一堆UIImage
来测试了这一点,模拟了一个释放所有已创建图像的内存警告:
图像不言自明。释放我的UIImage
(在~00:08)从常驻内存中删除了大GC raster data
块。
因为从UI中完全删除图像可能不是用户体验的最佳解决方案,也许您可以尝试在接收内存警告时缩小最大图像的尺寸,较差的分辨率会导致较小的内存占用。另一个想法(再次取决于你的图像用途)可能是将图像转储到磁盘,并在需要时加载它们。
希望有所帮助。