在IOS海量内存泄漏的UIWebView(massive memory leak in ios UI

2019-09-02 18:44发布

寻找在我们的系统中其他MEM泄漏,我创建了一个20 MB的网页与元刷新标记。 当时的想法是,通过我们的数据路径代码移动大量的数据来证实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。 应用程序存储器命中300MB约2分钟,被枪杀在低MEM警告,甚至当我们的代码是不是在玩。

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

我曾尝试使用loadURL: “有关:空白”,loadhtml: “” 的JavaScript文件关闭。

我也试着写一个递归removeFromSuperview和removeFromParentViewController,阅读,在网页视图私人滚动型是内存的问题,但记忆永远不会被释放。 我似乎无法找到一个可靠的方式来关闭,dealloc的网页视图,当我们用它做。

我们住在一起的WebView泄露了好一阵子的速度比较慢以及真想找个确保网页视图的方式可当我们用它做全面清理。 我们最近转换的应用ARC这并没有改变内存速度。

我正在考虑通过在web视图中的所有对象试图递归循环,看看他们是否可以被释放。 仪器显示cfdatas,活着的20万桶,为20MB页面的每次刷新,但没有显示出他们作为泄漏。 如果我只提供响应报头,并做了urlprotocol客户端,我们运行稳定,从而为强麦确认数据路径的其余部分memleaks,但这是这样一个戏剧性的测试用例结果我希望能找到一个网页视图MEM一旦泄漏解决方案并为所有。

没有任何一个有更好的想法或者有没有人试图通过对象一个UIWebView递归?

Answer 1:

我摆脱了我一个UIWebView的内存泄漏的方法是通过它的HTML设置为空字符串。 一个地方要做到这一点,当包含Web视图的视图控制器消失:

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


Answer 2:

一喊给所有开发:实现didReceiveMemoryWarning是绝对必须使用一个UIWebView的时候!

而当一个UIWebView可以导航任何地方,或者你知道一个网页,使UIWebView中有巨大的泄漏,如m.youtube.com这是特别重要的。

修复泄漏一个伟大的,通常无缝办法就是重新加载页面。 这样,你就不需要关心的页面变空,而且通常用户将能够继续从他离开的地方工作。

在您的视图控制器,覆盖didReceiveMemoryWarning是这样的:

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


Answer 3:

与iOS 8及以后,你真的很幸运。 WKWebView不漏,并具有更小的内存占用比UIWebView 。 它与含复杂的JavaScript图像载货网页进行了测试,它表现良好。

苹果WKWebView类参考

nshipster上WKWebView

这不是十全十美。 然后再希望的缺陷将及时解决。 退房吾福山的秘诀在GitHub上:

WKWebViewTips



Answer 4:

  • 在块Weakify“自我”。

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



文章来源: massive memory leak in ios UIWebView