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,检索页面高度的正式方法似乎不可靠:解决方法是获取正文部分的“计算样式”,并读取其高度值.
希望这可以帮助有人发现他的网页浏览漏洞.