我正在观看处理高级内存分析的 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 的等价物?