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

时间:2016-06-13 03:46:48

标签: ios objective-c uiwebview uiwebviewdelegate

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

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

和输出:

  

*** WebKit在webView中丢弃了一个未捕获的异常:decisionPolicyForNavigationAction:request:frame:decisionListener:delegate:assertion in delegate

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

currentSht.ListObjects.Add(xlSrcRange, Range(Cells(1, 1), Cells(erow, ecol)), , xlYes).Name = "Table1" Set lst = currentSht.ListObjects("Table1") lst.ListColumns.Add Position:=3 currentSht.Range("C2").Value = "=TEXT([@[Entry Time]],""mmm-d"")" lstHeaders = Array("", "ID", "Agent Name", "Date", "Clock In", "Clock Out") For i = 1 To 5 lst.ListColumns(i).Name = lstHeaders(i) Next i ***Concerning portion of code*** For i = erow to 1 step -1 if cells(i,3).TEXT = "Jan-0" Then cells(i,3).Value = "=([@[Clock Out]],""mmm-d"")" end if next i End Sub 引发了一个Objective-C异常并且可以捕获这些异常,因此它不能保证您的程序将被中止。在您自己的代码中使用它通常很好,但如果您的代码由框架调用 - 例如在调用委托时 - 它取决于框架的功能。正如您所发现的,WebKit会捕获异常并丢弃或自行处理它们。

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

HTH