システムの他の場所でメモリリークを探して、メタリフレッシュタグを使用して20MBのWebページを作成しました。 memの安定性を確認するために、データパスコードを介して大量のデータを移動するというアイデアでした。
<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に達し、低メモリ警告で撮影されます。
更新の読み込みを停止し、Webビューのロックを解除しようとしました。
Loadurl: "about:blank"、loadhtml: ""、javascriptドキュメントを閉じてみました。
また、再帰的なremoveFromSuperviewとremoveFromParentViewControllerを作成してみました。これは、Webビューのプライベートスクロールビューがメモリの問題であるが、メモリが解放されないことを示しています。 Webビューを閉じて、使い終わったら割り当てを解除するための信頼できる方法が見つからないようです。
私たちはかなり長い間、ウェブビューのリークの速度が遅い状態で生活してきましたが、ウェブビューが終了したときに完全にクリーンアップできることを保証する方法を本当に見つけたいと思っています。最近、アプリをARCに変換しましたが、メモリレートは変更されませんでした。
Webビュー内のすべてのオブジェクトを再帰的にループして、それらを解放できるかどうかを確認することを検討しています。インスツルメントは、20MBページを更新するたびに20MBのcfdataを有効に表示しますが、リークとしては表示しません。応答ヘッダーのみを配信してurlprotocolクライアントに実行した場合、安定して実行されるため、残りのデータパスのメモリリークを確認することができましたが、これは非常に劇的なテストケースの結果であり、Webビューのメモリリークソリューションを一度見つけることを望んでいます。そしてすべてのために。
誰かがより良いアイデアを持っているか、誰かがuiwebviewのオブジェクトを繰り返してみましたか?
UIWebViewのメモリリークを取り除く方法は、HTMLを空の文字列に設定することです。これを行う1つの場所は、Webビューを含むViewControllerが消えたときです。
- (void) viewWillDisappear:(BOOL)animated {
if (self.isMovingFromParentViewController) {
[self.wv loadHTMLString: @"" baseURL: nil];
}
}
また、UIWebViewがどこにでも移動できる場合、またはUIWebViewにm.youtube.comなどの大きなリークが発生することがわかっているページに移動できる場合は、特に重要です。
リークを修正するための優れた、通常はシームレスな方法は、ページをリロードすることです。そうすれば、ページが空になることを気にする必要がなく、通常、ユーザーは中断したところから作業を続けることができます。
ビューコントローラで、didReceiveMemoryWarningを次のようにオーバーライドします。
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
[myWebView reload];
}
IOS 8以降では、本当に幸運です。 WKWebView
はリークせず、UIWebView
よりもメモリフットプリントがはるかに小さくなります。複雑なJavascriptを含む画像を含むWebページでテストしたところ、良好に機能しました。
しかし、それは完璧ではありません。その後、うまくいけば、欠陥は時間内に解決されます。 GitHubで福山真吾のヒントを確認してください。
これは、ナビゲーションスタックをポップアウトした場合でもWebViewメモリの保持につながる重要な理由の1つでした。