iPhone iOS6如何将OS IO类型的“驻留脏内存”返回给操作系统?

时间:2013-04-03 00:09:19

标签: objective-c memory-management ios6 memory-profiling

我正在观看WWDC 2010视频,该视频涉及高级内存分析(会话311 ):

enter image description here

在视频的大约45:00,性能工程师讨论如何处理" Resident Dirty memory"您的应用已加载到RAM中。工程师建议,为了响应内存警告,您的应用应清除此信息。工程师在他的定制课程中粘贴" flush"方法进入didReceiveMemoryWarning,一切都很好,但代码并没有提供任何如何释放内存的例子。

我的问题是 - 如何清除"图像IO"?所使用的大块脏内存:

这里有大约74 MB的内存,只是坐在脏兮兮的地方(现在接近6分钟),等待有人将其返回到iOS6。什么都没发生。由于它不会自行消失,我需要知道如何将其返回iOS。

enter image description here

这些块似乎来自这样的代码和(可能是其他与图像相关的操作)。

 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的等价物?

1 个答案:

答案 0 :(得分:1)

我不是这些问题的专家,但基于我使用您提供的代码进行的测试,我要说您只需要释放在这些代码块中创建的UIImage。 / p>

据我了解,Image IOGC raster data标记的内存块实际上只是图片的基础数据(UIImageUIKit封装在上面这些)。因此,要释放内存,请释放图像。

我通过使用您的代码创建了一堆UIImage来测试了这一点,模拟了一个释放所有已创建图像的内存警告:

A whopping 1.5GB of CG data
All gone !

图像不言自明。释放我的UIImage(在~00:08)从常驻内存中删除了大GC raster data块。

因为从UI中完全删除图像可能不是用户体验的最佳解决方案,也许您可​​以尝试在接收内存警告时缩小最大图像的尺寸,较差的分辨率会导致较小的内存占用。另一个想法(再次取决于你的图像用途)可能是将图像转储到磁盘,并在需要时加载它们。

希望有所帮助。