我正在尝试修复我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 视图。我重复使用相同的 Web 视图、相同的控制器、相同的一切。
Instruments 显示了一种非常奇怪的模式,其中所有泄漏的对象都是各种大小的通用块,并且没有一个附加任何信息:没有负责的库,没有负责的框架等。每次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>";
所以,问题是:有人知道这里发生了什么吗?显然,在我的 HTML 中包含一个 Javascript 文件会UIWebView
导致内存泄漏。
UIWebView
当我重用同一个对象或每次我有内容时实例化一个新对象时都会出现泄漏这一事实,这使我认为 javascript 文件的处理方式一定存在loadHTMLString
导致泄漏的原因。
有谁知道如何解决这个问题?