虽然有很多关于这个问题的讨论,但我还没有找到答案。
问题是,在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一样工作,如此漏洞。释放这些资源的诀窍是什么?
答案 0 :(得分:2)
怎么可能?
UIWebView
是一个基于WebKitLegacy的旧API。由于一个原因,它没有被弃用 - Apple没有替代品(直到iOS 9)。
流行的浏览器如何像Safari和Chrome一样工作 这样的泄漏。
Safari是一款由Apple自己创建的浏览器。它可以使用AppStore中限制的任何黑客和私有API。实际上,目前Safari的行为非常接近WKWebView
的行为。但它从未与UIWebView
类似。
直到最近谷歌Chrome才能迁移到WKWebView
。有关详细信息,请参阅https://bugs.chromium.org/p/chromium/issues/detail?id=423444。在此之前,谷歌Chrome面临着同样的问题。
释放这些资源的诀窍是什么?
我尝试过很多技巧,但没有一个能为我效劳。不幸的是,唯一的解决方案是迁移到iOS 8中引入的WKWebView
。此外,WKWebView
在iOS 8下有很多错误,因此在大多数情况下它只能从iOS 9开始使用