ios UIWebView中的大规模内存泄漏

ios UIWebView中的大规模内存泄漏,ios,memory,uiwebview,refresh,memory-leaks,Ios,Memory,Uiwebview,Refresh,Memory Leaks,我在系统的其他地方寻找mem漏洞,创建了一个20mb的网页,上面有一个meta-refresh标签。我们的想法是通过我们的datapath代码移动大量数据,以确认mem的稳定性 <html> <meta http-equiv="refresh" content="1"> <body> <div style="border: 1px solid red"> Content loading </div><!-- 20mb wo

我在系统的其他地方寻找mem漏洞,创建了一个20mb的网页,上面有一个meta-refresh标签。我们的想法是通过我们的datapath代码移动大量数据,以确认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显示的元刷新页面非常、非常快地泄漏内存。应用程序内存在大约2分钟内达到300mb,并在低内存警告下被截获,即使我们的代码不起作用

我已停止刷新加载并尝试解除锁定webview

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

我还尝试编写递归removeFromSuperview和removeFromParentViewController,读到webview中的私有scrollview是内存问题,但内存永远不会释放。我似乎找不到一个可靠的方法来关闭、释放一个webview

我们已经经历了相当长一段时间的缓慢的webview泄漏,我们真的很想找到一种方法来确保webview在使用完毕后能够被完全清理。我们最近将应用程序转换为ARC,这并没有改变内存速率

我正在考虑对webview中的所有对象进行递归循环,看看是否可以释放它们。对于每次刷新20MB页面,instruments会显示20MB的CFDATA(活动),但不会将其显示为泄漏。如果我只发送响应头并将其发送到urlprotocol客户端,我们将稳定运行,因此ale将确认其余数据路径中的memleaks,但这是一个如此引人注目的测试用例结果,我希望能够一劳永逸地找到webview mem leak解决方案


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

我消除UIWebView内存泄漏的方法是将其HTML设置为空字符串。这样做的一个地方是当包含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];
}
  • 在街区里削弱“自我”

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

对于iOS 8及以后的版本,您真的很幸运
WKWebView
不会泄漏,并且比
UIWebView
的内存占用小得多。在使用包含复杂Javascript的图像页面进行测试后,它表现良好

但这并不完美。然后再一次希望瑕疵能及时解决。在GitHub上查看福山新戈的提示:


当应用程序显示没有泄漏,但数据不断增长时,这意味着这些对象在某个地方是活动的。找到它们(查看它们在仪器中的保留/释放历史)这有助于减少泄漏,但没有完全解决问题。不过,感谢您分享您的解决方案。@Myxtic别忘了将web视图的委托也设置为nil。是的,我也有,这没有多大帮助。在我的例子中,这修复了内存泄漏!这在iOS 8上非常好,但我们中的许多人仍然必须支持iOS 7。我们中的许多人都尝试过iOS 7上提供的解决方案,但运气不佳。令人沮丧的是,这不一定是真的。我不能100%确定在iOS 8上是否是这样,但在iOS 9上,wkWebView会到处泄漏内存。对于任何基于此决定切换到wkWebView的人来说,这只是一个提醒。我刚刚试过这个。这导致UIWebView无法控制地多次重新加载,但无法控制内存增长。我应该更有耐心吗?