【问题标题】:NSAssert not work in uiwebview delegate methodNSAssert 在 uiwebview 委托方法中不起作用
【发布时间】:2016-06-13 03:46:48
【问题描述】:

在 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 中丢弃了一个未捕获的异常

【问题讨论】:

标签: ios objective-c uiwebview uiwebviewdelegate


【解决方案1】:

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

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

HTH

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      相关资源
      最近更新 更多