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
在 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