NSAssert not work in uiwebview delegate method



在UIWebView的委托方法webView:shouldStartLoadWithRequest:navigationType:中,我在那里放了一个NSAssert,但它只是输出一个日志,而不是终止。这是我的代码:

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

和输出:

WebKit 丢弃了 webView 中未捕获的异常:decidePolicyForNavigationAction:request:frame:decisionListener: delegate: assertion in delegate

>NSAssert会引发一个Objective-C异常,这些异常可以被捕获,所以它不能保证你的程序会被中止。在你自己的代码中使用它通常没问题,但如果你的代码是由框架调用的(例如在调用委托时),这取决于框架的作用。正如您发现的那样,WebKit 会捕获异常并丢弃或自行处理它们。

简单的解决方案是使用标准assert()功能。这将采用单个布尔表达式,并将中止程序,打印出断言的表达式、文件名和行号。此函数不使用 Objective-C 异常,它使用标准abort()函数,因此无法捕获。

NSAssert引发 ObjC 异常失败。(准确地说NSInternalInconcistencyException。任何人都可以安装异常处理程序或其他机制来定义在他们调用的代码中引发的异常会发生什么情况。这些机制不必包括停止进程(尽管在异常后继续通常不是一个好主意)。

当您在回调中引发 ObjC 异常时,不能保证执行会因此而终止 — 您受调用您的代码设置的任何异常处理的摆布。如果你想让整个过程由于委托代码中的一些失败而崩溃,最好自己abort()

最新更新