16

システムの他の場所でメモリ リークを探して、メタ リフレッシュ タグを付けた 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 のオブジェクトを再帰しようとしましたか?

4

4 に答える 4

21

UIWebView のメモリ リークを取り除く方法は、HTML を空の文字列に設定することです。これを行う 1 つの場所は、Web ビューを含むビュー コントローラーが消える場合です。

- (void) viewWillDisappear:(BOOL)animated {
    if (self.isMovingFromParentViewController) {
        [self.wv loadHTMLString: @"" baseURL: nil];
    }
}
于 2013-05-13T02:59:00.867 に答える
2

iOS 8 以降では、本当に幸運です。WKWebViewはリークせず、メモリ フットプリントが よりはるかに小さくなりますUIWebView。複雑な Javascript を含む画像を含む Web ページでテストしたところ、うまく機能しました。

Apple の WKWebView クラス リファレンス

nshipster on WKWebView

しかし、それは完璧ではありません。それからまた、うまくいけば、不完全さが時間内に解決されるでしょう。GitHub で Shingo Fukuyama のヒントをチェックしてください。

WKWebViewTips

于 2015-02-18T14:59:14.553 に答える
-1
  • ブロックで「自分」を弱体化。

これは、ナビゲーション スタックからポップアウトされた場合でも、WebView メモリの保持につながる重要な理由の 1 つです。

于 2014-11-25T05:52:41.953 に答える