ios – 内存泄漏与UIWebView和Javascript

前端之家收集整理的这篇文章主要介绍了ios – 内存泄漏与UIWebView和Javascript前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在修复一些我的UIWebView导致的漏洞,找不到它们的起源和解决方法.我做的是通过网络请求从Web上获取一些内容,然后组装我的 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刷新网页视图.我重复使用相同的Web视图,相同的控制器,一切都一样.

仪器显示了一个非常奇怪的模式,其中所有泄露的对象都是各种大小的通用块,并且没有任何信息附加到它:没有负责任的库,没有负责任的框架等.每次执行loadHTMLString时,都会添加新的泄漏.

似乎在S.O.中有几个线程.关于UIWebView泄漏内存.我已经尝试了我发现的所有建议(例如,将NSURLCache设置为零或重置它;我尝试发布现有的UIWebView并且每当我有新的数据等分配一个新的),但没有任何帮助.

到目前为止,我的调查得出了一个明确的结果:似乎只有当我加载到视图中的HTML包含一些Javascript时才会出现泄漏.如果您注意到上面的HTML字符串,它由几个组件组成;一个是[自己的脚本],这是一个简单地返回的函数

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处理,导致泄漏.

有人知道如何解决这个问题吗?

解决方法

我终于找到了一些关于发生的事情的线索,最重要的是我想分享解决方法.

我可以确认,简单的包含一些JavaScript文件是在重新加载Web视图时引起内存泄漏.我甚至尝试使用HTML内容构建文件,然后通过loadRequest将其加载到UIWebView中,并通过重新加载重新加载;泄漏总是在那里.我会为此发布一个雷达.

救了我的是使用innerHTML来更新网页视图的内容.而不是依赖于重新加载或加载HTMLString,我用一个空的身体初始化了我的Web视图(我的意思是,头部包括所有必需的JS / CSS文件),然后更新它设置document.body.innerHTML:

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

与setBody定义如下:

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

我获得了两个好处:网页视图更新变得非常快(这是不能更新DOM的一个效果,另一方面整体上并不是完全可取的),而且没有内存泄漏在“仪器”下运行.缺点是我不得不微调几个条件,应用程序运行正常;特别:

>加载Web视图(即使是空的body页面)也需要很多,所以当DOM准备好的时候,你必须同步其内容的第一次更新;
> webViewDidFinishLoading似乎不可靠:它在document.readyState完成之前执行;
> document.documentElement.height,检索页面高度的正式方法似乎不可靠:解决方法获取正文部分的“计算样式”,并读取其高度值.

希望这可以帮助有人发现他的网页浏览漏洞.

原文链接:https://www.f2er.com/iOS/330184.html

猜你在找的iOS相关文章