ios UIWebView中的大量内存泄漏

寻找我们的系统其他地方的内存泄漏,我创build了一个20 MB的网页与元刷新标签。 我们的想法是通过我们的数据path代码移动大量的数据来确认mem的稳定性。

<html> <meta http-equiv="refresh" content="1"> <body> <div style="border: 1px solid red"> Content loading </div><!-- 20mb worth of comments --> </body> </html> 

我发现uiwebview显示meta刷新页面泄漏内存非常,非常快。 应用程序内存在大约2分钟内达到300mb,即使在我们的代码不在播放的情况下,也会发出低内存警告。

我已经停止了刷新加载,并试图释放web视图。

我试过loadurl:“about:blank”,loadhtml:“”,javascript文档closures。

我也试着写一个recursion的removeFromSuperview和removeFromParentViewController,阅读webview中的私人滚动视图是一个内存问题,但该内存永远不会释放。 我似乎无法find一个可靠的方式来closures,当我们完成了一个webview的dealloc。

我们生活在一个缓慢的webview泄漏的时间很长一段时间,真的想find一种方法来确保当我们完成了一个webview可以完全清理。 我们最近把应用程序转换成了不改变内存速率的ARC。

我正在考虑尝试通过webview中的所有对象的recursion循环,看看他们是否可以被释放。 仪器显示20MB的cfdatas,对于20MB页面的每一次刷新都是活着的,但是并不显示它们是泄漏的。 如果我只提供响应头并完成了urlprotocol客户端,我们运行稳定,所以是ale确认memleaks在其余的数据path,但这是一个戏剧性的testing用例结果希望find一个webview的mem泄漏解决scheme一次并为所有。

有没有人有任何更好的想法,或有任何人试图通过uiwebview中的对象recursion?

我摆脱了我的UIWebView的内存泄漏的方式是将其HTML设置为空string。 一个地方要做到这一点是当视图控制器包含Web视图消失:

 - (void) viewWillDisappear:(BOOL)animated { if (self.isMovingFromParentViewController) { [self.wv loadHTMLString: @"" baseURL: nil]; } } 

对所有的开发者大声疾呼:使用UIWebView时,实现didReceiveMemoryWarning是绝对必要的!

当UIWebView可以导航到任何地方或导致导致UIWebView出现巨大漏洞的页面(如m.youtube.com)时,这一点尤其重要。

一个伟大的,通常无缝的方式来解决泄漏只是重新加载页面。 这样你就不必关心页面变空了,通常用户将能够从他离开的地方继续工作。

在你的视图控制器中,覆盖didReceiveMemoryWarning像这样:

 - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; [myWebView reload]; } 

随着iOS 8及以上,你真的很幸运。 WKWebView不会泄漏,并且比UIWebView具有更小的内存占用。 用包含复杂Javascript的图像载入网页进行testing,performance良好。

苹果的WKWebView类参考

在WKWebView的nshipster

这不是完美的。 然后再次希望不完善将及时得到解决。 在GitHub上查看Shingo Fukuyama的提示:

WKWebViewTips

  • 在块中弱化“自我”。

这是导致WebView内存突然出现导航堆栈的重要原因之一。