ios – 内存泄漏与UIWebView和Javascript

ios – 内存泄漏与UIWebView和Javascript,第1张

概述我正在修复一些我的UIWebView导致的漏洞,找不到它们的起源和解决方法.我做的是通过网络请求从Web上获取一些内容,然后组装我的 HTML并加载它: NSString* body = <some HTML>;NSString* html = [NSString stringWithFormat:kHTMLTemplate, [self scripts], [self styles], bod 我正在修复一些我的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,检索页面高度的正式方法似乎不可靠:解决方法是获取正文部分的“计算样式”,并读取其高度值.

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

总结

以上是内存溢出为你收集整理的ios – 内存泄漏与UIWebView和Javascript全部内容,希望文章能够帮你解决ios – 内存泄漏与UIWebView和Javascript所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1097427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存