内存泄漏与一个UIWebView和Javascript(Memory Leaks with UIWe

2019-07-30 19:11发布

我试图修复了一堆,我的泄漏UIWebView导致,并不能找到其来源,也不是一个解决办法。 我要做的就是充分利用网络的一些内容通过网络请求,然后组装我的HTML并加载它在运行:

NSString* body = <some HTML>;
NSString* html = [NSString stringWithFormat:kHTMLTemplate, [self scripts], [self styles], body];
[_webView loadHTMLString:html
               baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];

每次有新的内容可用,我执行loadHTMLString再度刷新网页视图。 我重复使用相同的网络视图,相同的控制器,同一切。

仪器显示了一个很奇怪的模式中,所有泄漏的对象有各种规格的通用块和他们都没有附带任何信息:没有一个负责任的图书馆,没有一个负责任的框架等,每一次loadHTMLString执行,新的泄漏被添加。

它似乎有多个线程在SO约UIWebView内存泄漏。 我已经尝试了,我发现所有的建议(例如,设置NSURLCache为零,或将其复位;我试图释放现有的UIWebView,每次我有新的数据等分配一个新鲜的),但没有任何帮助。

我调查到现在导致一个明确的结果:它似乎泄漏是,如果我加载到视图中的HTML包含一些JavaScript才存在。 如果您发现html上面的字符串,它是由几部分组成; 一个是[self scripts]其是简单地返回一个功能:

return @"<script type='text/javascript' src='jquery-1.4.4.min.js'></script>"
        "<script type='text/javascript' src='jmy.js'></script>";

如果我删除此,无泄漏的存在。 但泄漏,只要我一出现添加<script>标记我的HTML。 他们甚至会出现,如果我只是包括jQuery的文件(或任何其他JS文件,对此):

return @"<script type='text/javascript' src='jquery-1.4.4.min.js'></script>";

因此,问题:有没有人对这里发生了什么想法? 显然,包括JavaScript文件到我的HTML正在使UIWebView泄漏内存。

事实上,泄漏的出现既当我重复使用同一个UIWebView对象或当我每一次我有内容实例化一个新的,让我觉得必须有一些JavaScript文件中被处理的方式loadHTMLString这导致了泄漏。

有谁知道这可能是固定?

Answer 1:

我终于找到了一些线索,在发生什么事,首先,我想与大家分享一个解决方法。

我可以证实,一些JavaScript文件的简单列入已于Web视图的重载导致内存泄漏。 我甚至尝试建设有HTML内容的文件,然后将其加载到UIWebView通过loadRequest ,并通过它重装reload ; 泄漏总是在那里。 我将发布该雷达。

是什么拯救了我使用innerHTML更新Web视图的内容。 而不是依靠reloadloadHTMLString ,我初始化一个空的身体(我的意思是,我的Web视图head节在那里,包括所有必需的JS / CSS文件),然后更新其设置document.body.innerHTML

body = [body stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setBody(\"%@\");", body]];

像这样定义setBody:

var setBody = function(body) {
    document.body.innerHTML = body;
}

我得到两个好处:Web视图更新变得真快(这是不更新DOM,这在另一方面不是在整体上完全可取的效果),而且没有内存泄漏是运行在仪器的应用。 其缺点是,我不得不微调一对夫妇,其中应用程序是运行罚款的条件; 特别:

  1. 加载Web视图(即使是空的正文页面)走了很多,所以你要其内容当DOM准备的第一次更新同步;

  2. webViewDidFinishLoading似乎并不可靠:这是之前执行document.readyState成为complete ;

  3. document.documentElement.height ,检索页面高度的正式方式似乎并不可靠,太:解决方法是获得的“计算样式” body的一部分,并阅读其height值。

希望这可以帮助别人谁发现他的网络视图泄漏内存。



文章来源: Memory Leaks with UIWebView and Javascript