UIWebView 内存泄漏。释放未使用资源的魔法是什么?

UIWebView memory leaks. What is the magic to release unused resources?

虽然有很多关于这个主题的讨论,但我仍然没有找到答案。

问题是,UIWebView加载一个页面后,永远不会释放所有使用的内存资源。

我创建了一个空项目。刚刚添加了 UIWebView。加载请求前使用的内存 (http://methodhome.com/cleanhappy) 为 4.5MB,加载完成后 - 70 ~ 90 MB。

释放UIWebView后,使用的内存还是55MB

所以看起来有大约 50MB 的内存泄漏。

我尝试了以下方法:

[_webView stringByEvaluatingJavaScriptFromString:@"var body=document.getElementsByTagName('body')[0];body.style.backgroundColor=(body.style.backgroundColor=='')?'white':'';"];
[_webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML='';"];
[_webView stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"];
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
[_webView loadHTMLString:@"" baseURL:nil];
[_webView stopLoading];
_webView.delegate = nil;
[_webView removeFromSuperview];
_webView = nil;

[[NSURLCache sharedURLCache] removeAllCachedResponses];

我也试过设置:

[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];

并玩过内存和磁盘的缓存设置。 没有任何帮助。

这怎么可能?流行的浏览器是如何像 Safari 和 Chrome 那样工作的呢?释放那些资源的技巧是什么?

How can it be possible?

UIWebView 是旧的 API,基于 WebKitLegacy。它没有因为 1 个单一原因而被弃用 - Apple 没有替代品(直到 iOS 9)。

How are the popular browsers are working like Safari and Chrome with such a leaks.

Safari 是一个浏览器,由Apple 自己创建。它可以使用任何 hack 和私人 APIs,在 AppStore 中受到限制。实际上,目前 Safari 的行为非常接近 WKWebView 的行为。但它从未与 UIWebView.

相似

最近 Google Chrome 才能够迁移到 WKWebView。有关详细信息,请参阅 https://bugs.chromium.org/p/chromium/issues/detail?id=423444。在此之前,Google Chrome 也面临同样的问题。

What is the trick to release those resources?

我尝试了很多技巧,但 none 对我有用。不幸的是,唯一的解决方案是迁移到WKWebView,在iOS 8中引入。此外,WKWebView在iOS 8下有很多错误,所以在大多数情况下它只能使用从 iOS 9.

开始