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

Nik*_*ita 7 iphone memory-leaks memory-management uiwebview ios

虽然有很多关于这个问题的讨论,但我还没有找到答案.

问题是,在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];
Run Code Online (Sandbox Code Playgroud)

我也尝试过设置:

[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
Run Code Online (Sandbox Code Playgroud)

并使用内存和磁盘的缓存设置.什么都没有帮助.

怎么可能?流行的浏览器如何像Safari和Chrome一样工作,如此漏洞.释放这些资源的诀窍是什么?

Bor*_*kyi 2

怎么可能?

UIWebView是一个旧的 API,基于 WebKitLegacy。它之所以被弃用,只有一个原因:Apple 没有替代品(直到 iOS 9)。

像 Safari 和 Chrome 这样的流行浏览器是如何工作的?

Safari 是一款浏览器,由 Apple 自己创建。它可以使用 AppStore 中限制的任何 hack 和私有 API。实际上,目前 Safari 的行为与WKWebViewSafari 的行为非常接近。但它从来都不像UIWebView

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

释放这些资源有什么技巧呢?

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