2016-02-16 21 views
6

比較的安全な(私にとっては)修正が行われた後、アプリはいくつかのWebKitLegacyにクラッシュし始めました。私はFabricに多くのクラッシュを見ていますが、再現する安定したステップを見つけることはできません。 誰かがクラッシュを引き起こす可能性があることを知っていますか?付属の画像をご覧ください。iOS:WebKitLegacyがクラッシュする

一部のアプリケーション画面ではUIWebViewを使用してコンテンツを表示していますが、問題がどこかにあると想定しています。

enter image description here enter image description here

+0

を結びますか? 'webview.delegate = nil'と' [webview stopLoading] 'をどこで呼びますか? – JAL

+0

私はiOS7 +を対象としています。おそらく次のバージョンは8+です。 delegate = nilがdeallocで呼び出されます。 stopLoadingはviewWillDisappearで呼び出されます。 – Division

+0

私はこれは、Appleからの公式溶液「のiOS 8へのアップグレード」することになります(iOSの7に登場したが、iOSの8で固定した)WebKitの内部バグであるかなり確信していますまた、私は 'viewWillDisapear'または' dealloc'でそれを呼び出してみてください、あなたは '' webview.delegate = nil'を呼んでいる場所に変更してみてくださいと '[WebViewのstopLoading]と思います。 – JAL

答えて

1

私の知る限り覚えているように、WebViewの更新(埋め込まれた画像から、例えば、応答)を受信したときに信号が現れたが、それを使用していないので、レンダリングすることができませんでしたもはやメインスレッドによって。つまり、ViewControllerが表示されていないときです。

このような場合は、負荷の高いWebページ(たとえば、オンラインの新聞http://edition.cnn.com/など)を読み込んで、読み込みを開始した直後に別のWebページをプッシュ/ポップすることで問題を再現できるようにする必要がありますViewController。それを修正する方法

は:確かに、あなたはあなたが言及したメソッドを呼び出す必要があります:

webview.delegate = nil; 
[webview stopLoading]; 

しかし、そうするための場所は決してdeallocに、viewWillDisappear方法です。理由は簡単です:viewWillDisappearは、ViewControllerがメインスレッドの制御を失う直前に呼び出されます。ただし、VCがヒープに解放される直前に、deallocが呼び出されます。これは数秒後に起こり、アプリケーションにクラッシュする貴重な時間を与えたり、まったく呼び出されないことがあります。両方の方法を動かすと、そのトリックを行うべきです。

+1

のWebビューを使用してビューコントローラは、他のビューコントローラをプッシュした場合、あなたはデリゲートたときにそのビューコントローラを失うことになるので、webview.delegate = nil' viewWillDisappear' 'に'の呼び出しに注意してくださいユーザーがWebビュー画面に戻ります。これを修正する一つの方法は、 'viewWillAppear'に' delegate'を再設定することです。 –

+0

あなたは絶対的に正しいです:)明確化してくれてありがとう! – Bartserk

1

UIWebView EXC_BAD_Address ...アプリケーション受信信号 まず、webView.delegate = nilについて考える必要があります。 しかしどこ?

私の経験:

- (void)dealloc{ 
    /* 
    Important 
    Before releasing an instance of UIWebView for which you have set a delegate, 
    you must first set the UIWebView delegate property to nil before disposing of the UIWebView instance. 
    This can be done, for example, in the dealloc method where you dispose of the UIWebView. 
    */ 
    if (_webView.loading) { 
     [self.webView stopLoading]; 
    } 
    _webView.delegate = nil; 
} 

ViewControllerは別ViewControllerの子であるならば、あなたは のアニメーションで見る「 ViewControllerは親からのビュー」のViewControllerの除去をトリガすることができます。同時に、 は、その親からViewControllerを削除し、その参照を削除することができます。この時点ViewControllerで **はWebViewのデリゲートがクリーンアップされません ** 使用のdeallocを意味し、と呼ばれることはありませんはnilとviewWillDisappearこととあなたのWebViewは常にクリーンアップされることを保証します。

その他の優れたあなたは何のiOSバージョンをターゲットにしている ios:EXC_BAD_ACCESS for Webview delegate

関連する問題