システムの他の場所でメモリ リークを探して、メタ リフレッシュ タグを付けた 20 MB の Web ページを作成しました。アイデアは、メモリの安定性を確認するために、データパス コードを介して大量のデータを移動することでした。
<html>
<meta http-equiv="refresh" content="1">
<body>
<div style="border: 1px solid red">
Content loading
</div><!-- 20mb worth of comments -->
</body>
</html>
私が見つけたのは、メタ更新ページが非常に高速にメモリをリークしていることを示す uiwebview でした。アプリのメモリは約 2 分で 300 MB に達し、コードが実行されていない場合でもメモリ不足の警告が表示されます。
更新の読み込みを停止し、webview の割り当てを解除しようとしました。
loadurl:"about:blank", loadhtml:"", javascript document close を試しました。
また、再帰的なremoveFromSuperviewとremoveFromParentViewControllerを書いてみました.webviewのプライベートスクロールビューはメモリの問題ですが、そのメモリは決して解放されません. 信頼できる閉じ方を見つけることができないようです。完了したら、webview の割り当てを解除します。
私たちはかなり長い間、WebView のリークが遅い速度で生きてきました。WebView を使い終わったときに WebView を完全にクリーンアップできることを保証する方法を本当に見つけたいと思っています。最近、アプリを ARC に変換しましたが、メモリ レートは変わりませんでした。
webview 内のすべてのオブジェクトを再帰ループして、解放できるかどうかを確認することを検討しています。instruments は、20MB のページを更新するたびに 20MB の cfdata が生きていることを示しますが、それらをリークとしては示しません。応答ヘッダーのみを配信し、安定して実行される urlprotocol クライアントに実行した場合、データ パスの残りの部分でメモリリークを確認することができましたが、これは非常に劇的なテスト ケースの結果であり、webview のメモリ リーク ソリューションを一度見つけたいと考えています。そしてすべてのために。
誰かがより良いアイデアを持っていますか、または誰かが uiwebview のオブジェクトを再帰しようとしましたか?