4

我正在观看处理高级内存分析的 WWDC 2010 视频(会话 311):

在此处输入图像描述

在视频的 45:00 左右,性能工程师讨论了如何处理您的应用已加载到 RAM 中的“驻留脏内存”。工程师建议,为了响应内存警告,您的应用程序应该清除它。工程师将他的自定义类“flush”方法粘贴到didReceiveMemoryWarning其中,一切都很好,但代码并没有真正提供任何关于如何释放内存的示例。

我的问题是 -如何刷新“Image 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 的等价物?

4

1 回答 1

1

我远不是这些问题的专家,但根据我使用您提供的代码进行的测试,我想说您只需要发布UIImage在这些代码块中创建的 s 即可。

据我了解,Image IOGC raster data标记的内存块实际上只是图像的基础数据(UIImage作为UIKit这些数据的包装器)。所以要释放内存,释放图像。

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

高达 1.5GB 的 CG 数据
全没了 !

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

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

希望有帮助。

于 2013-06-16T21:51:00.087 回答