2016-06-13 5 views
0

UIWebViewのデリゲートメソッドwebView:shouldStartLoadWithRequest:navigationType:では、そこにNSAssertを置きますが、終了する代わりにログを出力するだけです。ここに私のコードは次のとおりです。NSAssertはuiwebviewデリゲートメソッドでは機能しません

- (BOOL)webView:(UIWebView *)webView 
shouldStartLoadWithRequest:(NSURLRequest *)request 
      navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSAssert(NO,@"assertion in delegate"); 
    return YES; 
} 

と出力:decidePolicyForNavigationAction::リクエスト:フレーム:

***のWebKitは、WebViewの中にキャッチされない例外を捨てdecisionListener:デリゲート:デリゲートでアサーション

+1

がこれを見http://stackoverflow.com/questions/7883899/ios-5-uiwebview-delegate-webkit-discarded-an-uncaught-exception-in-the-webview –

答えて

0

NSAssertは、Objective-C例外を発生させ、これらがキャッチされる可能性があるため、プログラムが強制終了されることはありません。独自のコードでそれを使用するのは一般的に問題ありませんが、デリゲートが呼び出されたときなど、フレームワークによってコードが呼び出された場合、そのコードはフレームワークの機能に依存します。あなたが発見したWebKitは例外をキャッチし、それ自体を破棄または処理します。

単純な解決策は、standard assert() functionを使用することです。これは単一のブール式をとり、式、ファイル名、およびアサーションの行番号を出力するプログラムを中止します。この関数はObjective-C例外を使用せず、standard abort() functionを使用するため、捕捉できません。それはあなたを助けたら、HTH

+0

ありがとう!それが私の質問を解決しました。 –

0

失敗NSAssert s ObjC例外を発生させます。 (NSInternalInconcistencyException正確に。)誰でもinstall exception handlers or other mechanismsを呼び出して、呼び出すコードで発生した例外を定義することができます。そして、それらのメカニズムはプロセスを停止することを含む必要はありません(例外は一般的には良い考えではありません)。

コールバックでObjC例外を発生させると、結果として実行が終了することは保証されません。コールされたコードによって設定された例外処理が何であれ、あなたは慈悲に満ちています。デリゲートコードで何らかのエラーが発生してプロセス全体がクラッシュする場合は、おそらくabort()にお勧めします。

関連する問題