ios UIWebView中的大量内存泄漏

时间:2013-05-13 02:52:54

标签: ios memory uiwebview refresh memory-leaks

在我们系统的其他地方寻找内存泄漏,我创建了一个带有元刷新标记的20 MB网页。我的想法是通过我们的数据路径代码移动大量数据以确认内存稳定性。

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

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

我已停止刷新加载并尝试取消分享webview。

我尝试过loadurl:“about:blank”,loadhtml:“”,javascript文档关闭。

我还尝试编写一个递归的removeFromSuperview和removeFromParentViewController,读取webview中的私有scrollview是一个内存问题,但该内存永远不会被释放。当我们完成它时,我似乎无法找到一种可靠的方法来关闭,取消一个webview。

我们的网页浏览速度很慢,已经存在了很长一段时间,我们确实希望找到一种方法来确保在完成后可以完全清理网页视图。我们最近将应用程序转换为ARC,但没有改变内存速率。

我正在考虑通过webview中的所有对象尝试递归循环,看看它们是否可以被释放。仪器显示20 mb的cfdatas,alive,每次刷新20MB页面,但不会将它们显示为泄漏。如果我只提供响应头并完成urlprotocol客户端我们运行稳定,所以ale确认其余数据路径中的memleaks,但这是一个如此戏剧性的测试用例结果我希望找到一个webview内存泄漏解决方案一次并为所有人。

有没有人有更好的想法,或者有没有人尝试通过uiwebview中的对象进行递归?

4 个答案:

答案 0 :(得分:19)

我摆脱UIWebView内存泄漏的方法是将HTML设置为空字符串。一个地方是当包含Web视图的视图控制器消失时:

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

答案 1 :(得分:8)

向所有开发者致敬:使用UIWebView时,必须实现didReceiveMemoryWarning!

当UIWebView可以导航到任何地方或您知道导致UIWebView出现巨大泄漏的页面时,尤其重要,例如m.youtube.com。

修复泄漏的一种很好的,通常是无缝的方法就是重新加载页面。通过这种方式,您无需关心页面变空,通常用户将能够从他离开的地方继续工作。

在视图控制器中,覆盖didReceiveMemoryWarning,如下所示:

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

答案 2 :(得分:2)

在iOS 8及更高版本中,您真的很幸运。 WKWebView不泄漏,内存占用量比UIWebView小得多。在使用包含复杂Javascript的图像载入网页进行测试后,它表现良好。

Apple's WKWebView Class Reference

nshipster on WKWebView

但是,它并不完美。然后再次希望瑕疵能及时得到解决。查看Shingo Fukuyama关于GitHub的提示:

WKWebViewTips

答案 3 :(得分:0)

  • 在块中弱化“自我”。

即使弹出导航堆栈,这也是导致WebView内存占用的重要原因之一。