私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 は、リークされたすべてのオブジェクトがさまざまなサイズの General-block であり、それらのいずれにも情報が添付されていないという非常に奇妙なパターンを示します。責任のあるライブラリ、責任のあるフレームなどはありません。実行されるたびloadHTMLString
に、新しいリークが追加されます。
UIWebView
メモリリークについてSOにはいくつかのスレッドがあるようです。見つかったすべての提案を試しました (たとえば、NSURLCache
をゼロに設定するか、リセットします。既存の UIWebView を解放して、新しいデータがあるたびに新しいものを割り当てるなど)、何も役に立ちませんでした。
これまでの私の調査では、1 つの明確な結果が導き出されました。ビューにロードした HTML に Javascript が含まれている場合にのみ、リークが存在するようです。上記の文字列に気付いた場合html
、それはいくつかのコンポーネントで構成されています。1 つは[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>";
そこで質問ですが、ここで何が起きているか知っている人はいますか? 明らかに Javascript ファイルを HTML に含めると、UIWebView
メモリ リークが発生します。
UIWebView
同じオブジェクトを再利用するとき、またはコンテンツを取得するたびに新しいオブジェクトをインスタンス化するときにリークが発生するという事実は、リークにつながる javascript ファイルの処理方法に何かがあるに違いないと考えさせられますloadHTMLString
。
これを修正する方法を知っている人はいますか?