2016-06-13 3 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; 
} 

и выход:

*** WebKit отбрасываются неперехваченное исключение в WebView: decidePolicyForNavigationAction: Запрос: кадр: 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 и поэтому не может быть обнаружена.

НТН

+0

Благодаря! Это решило мой вопрос. –

0

Сбой NSAssert s повышение ObjC исключений. (NSInternalInconcistencyException, если быть точным.) Любой может install exception handlers or other mechanisms определить, что происходит с исключениями, которые возникают в коде, который они вызывают. И эти механизмы не должны включать остановку процесса (хотя продолжение после исключения, как правило, не является отличной идеей).

Когда вы вызываете исключения ObjC в обратном вызове, вам не гарантируется, что выполнение завершится в результате - вы находитесь на милость любой обработки исключений, созданной кодом, который вас вызвал. Если вы хотите, чтобы весь процесс рушился из-за некоторого сбоя в коде делегата, вероятно, это лучше всего для abort().

 Смежные вопросы

  • Нет связанных вопросов^_^