2014-01-16 3 views
26

私たちのアプリのホーム画面(そしてすべてのユーザーが最初に見たもの)にはいくつかのセクションがあり、そのほとんどはユーザーが開くことができる別のWebviewを含んでいます。そうすることで、メモリ使用量がわずか26MBから最大85MBまで、またはそれ以上に増加します(別のWebビューを開いた後)。使用後にiOSのUIWebViewリソースを解放する

私たちが見つけた問題は、いったん閉じてしまえば、すべてのWebページリソースがメモリに保持されているように見えることです(使用されたメモリはたぶん数MB減少します)。

webviewがオープンしなければならなかったリソースを解放したいのですが、後で、非常に多くのメモリを必要とする非常に厳しいセクションがあります。それらのウェブビューのいくつかは前に。

私はインターネット上でいくつかのオプションを試してみましたが、どれもこれまでに働いていませんでした。

// Try to clean used webview 

[self.webView loadHTMLString:@"" baseURL:nil]; 
[self.webView stopLoading]; 
self.webView.delegate = nil; 
[self.webView removeFromSuperview]; 
self.webView = nil; 

これらはメモリ使用量にほとんど影響を与えませんでした。私はここに欠けているものはありますか?私はすでに、私はWebViewのが開け続けるだろう何のリークがないことを確認し二重に私はすでに、私は(self.webView = nil;

編集持っていること、それへの参照のみを解放しています:私はちょうど一からプロジェクトを作成し、追加しましたwebviewとそれをクリックするたびに別のWebをロードするボタンがあり、これがメモリ使用量を増やします。私はまた、クリックしたときにwebviewを破壊するボタンを追加しました。それは、メモリが実質的にリソースを解放しないように、メモリは同じままです。あなたはジェイソン・ベイカーから、この記事をお読みください

+0

ARCを使用していますか? ARCを使用していない場合は、Webビューでリリースを呼び出す必要があります。 – Ankush

+0

@Ankushはい、ありがとうとにかく – h4lc0n

+1

あなたの質問の性質を誤解しているかもしれませんが、コントローラアーキテクチャを1つのUIWebViewインスタンスに変更することを提案したいと思いますが、これは本当に重いですが、素子。すべてのウィジェットをこのWebビューにフィードするサーバプロキシ/アグリゲータを追加できます。後であなたはjavascriptイベントをキャッチし、あなたのロジックを適用することができます – voromax

答えて

16

カテゴリを追加した後の2行を呼び出す必要がありますので、私は自分自身がそれを与えるために答えますよいくつかの閉鎖と、悲しいことに、この同じ問題を抱えている人には悪い知らせがあります。

私たちは何日もこの問題を解決しようと努力し続けていましたが、私たちに何もしないことを何らかの人々に話した後、 Webviewのアクセスをカスタムメイドのページに限定することにしました。

たとえば、インターネット上にウェブを開いたニュースセクションがありました。私たちがやったことは、タイトル、ボディー、ニュースに関連するイメージ(まだリソースのメモリ使用量が増えていますが、何千ものニュースはどんな危険にさらされても開かれる)。私は知っている、理想的ではない。

解決策、回避策、またはこの同じ問題を持つ将来のユーザーに対処するための手がかりを与えるためのアイデアなど、この質問に対するいくつかの建設的な回答を見たいと思っています。

+0

私はUIWebViewで多くの画像を読み込むとき、私は同じ問題を抱えています。コンテンツがUIWebViewに読み込まれると、メモリが増加し、アプリケーションを更新/再表示するまで解放されません。 –

+0

私もこの問題があります。それについて何もすることができないことは本当に悪い。私は1つのWebビューしか持っていませんが、ビデオがあります。私はここで推奨されているすべてを試してきました。やがて、多くの動画を見た後、アプリは転倒して終了します。 :( – BlueVoodoo

+0

これについてもっと知りましたか?私はまったく同じ振る舞いを見ています。URLを表示した後は、アプリケーションがクラッシュするまでメモリがロードされ続けます。しかし、私は指が交差しているのを忘れてしまっています。 –

7

は、

http://www.codercowboy.com/code-uiwebview-memory-leak-prevention/

彼は本当にのUIWebViewのメモリフットプリントをredueために私を助けたcategoryを作成しました。

あなたはちょうど私がこの質問をしたし、誰も周りにどんな仕事を知っていないようですので、それは数ヶ月をされている

-(void) dealloc 
{ 

    [self.webview cleanForDealloc]; 
    self.webview = nil; 
    [super dealloc]; 

} 
+2

はい、私はすでにそれを試みました。それは私が試してみるオプションがあるところですが、実際には機能しませんでした。私はそれが別のものを作るかどうかを確認するために、きれいなプロジェクトでもう一度行くつもりです。ありがとう – h4lc0n

1
override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    categoryWebView.stopLoading() 
    categoryWebView.removeFromSuperview() 
    categoryWebView = nil 

    URLCache.shared.removeAllCachedResponses() 
    URLCache.shared.diskCapacity = 0 
    URLCache.shared.memoryCapacity = 0 
    if let cookies = HTTPCookieStorage.shared.cookies { 
     for cookie in cookies { 
      HTTPCookieStorage.shared.deleteCookie(cookie) 
     } 
    } 
} 
関連する問題