NSAssert 在 uiwebview 委托方法中不起作用

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 discarded an uncaught exception in the webView:decidePolicyForNavigationAction:request:frame:decisionListener: delegate: assertion in delegate

失败 NSAssert 引发 ObjC 异常。 (准确地说是 NSInternalInconcistencyException。)任何人都可以 install exception handlers or other mechanisms 定义他们调用的代码中引发的异常会发生什么。而且这些机制不必包括停止进程(尽管在异常后继续通常不是一个好主意)。

当您在回调中引发 ObjC 异常时,无法保证执行会因此终止 — 您将受制于调用您的代码设置的任何异常处理。如果您希望由于委托代码中的某些错误而导致整个过程崩溃,那么最好 abort() 自己动手。

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

简单的解决方法是使用standard assert() function. This takes a single Boolean expression and will abort the program printing out the expression, file name and line number of the assertion. This function does not use Objective-C exceptions, it uses the standard abort() function,这样就不会被捕获。

HTH