我正在尝试修复由我的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
以刷新Web视图。 我重复使用相同的Web视图,相同的控制器,相同的一切。Instruments显示了一个非常奇怪的模式,其中所有泄漏的对象都是各种大小的General-blocks,并且没有任何信息附加:没有负责的库,没有负责的框架等。每次执行
loadHTMLString
时,都会添加新的泄漏。似乎在S.O.上有几个关于
UIWebView
泄漏内存的线程。 我尝试过我找到的所有建议(例如将NSURLCache
设置为零或重置它;每当我有新数据时,我尝试释放现有的UIWebView并分配一个新的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>";
如果我去掉它,就没有泄漏了。但是只要我在HTML中添加一个 <script>
标签,泄漏就会出现。即使我只是包括jQuery文件(或任何其他js文件,对于这一点也是如此)。return @"<script type='text/javascript' src='jquery-1.4.4.min.js'></script>";
问题是:有人知道这里发生了什么吗?明显地,将一个Javascript文件包含到我的HTML中会导致UIWebView
泄漏内存。
泄漏出现在我重用同一UIWebView
对象或每次有内容时实例化一个新对象的情况下,这表明loadHTMLString
处理javascript文件的方式可能导致泄漏。
有人知道如何解决这个问题吗?