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

时间:2015-01-12 09:49:44

标签: ios iphone memory-management memory-leaks uiwebview

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

问题是,在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一样工作,如此漏洞。释放这些资源的诀窍是什么?

1 个答案:

答案 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开始使用