NS在线程中使用

时间:2010-01-06 19:59:48

标签: iphone objective-c assert nsthread nsoperation

我正在尝试在我的iPhone应用程序中使用NSAssert,以便在发生意外情况时,应用程序失败并在崩溃日志中崩溃并显示有意义的消息。

如果失败的NSAssert在主线程上,这可以正常工作,因为默认情况下它会引发NSInternalInconsistencyException未被捕获并停止执行。但是我也在后台线程中进行处理,在这种情况下NSAssert只是中止线程,但编程一直在运行。

我目前的解决方案是在主线程中捕获并重新抛出异常(在本例中为NSOperation的{​​{1}}方法):

main

有更好的方法吗?也许使用自定义的NSAssertionHandler?

我知道我可以使用带有静态注释的C - (void)main { @try { int x = 14; ... NSAssert1(x > 20, @"x should be greater than 20, was %d", x); ... } @catch (NSException *e) { [e performSelectorOnMainThread:@selector(raise) withObject:nil waitUntilDone:YES]; } }

assert

但这不允许我显示assert(x > 20 && "x should be greater than 20"); 的实际失败值是什么。

1 个答案:

答案 0 :(得分:1)

您可以将NSAssert替换为测试代码,然后加载异常。这样,如果断言失败,将抛出异常,由@catch块捕获并在主线程上重新引发。

注意:您甚至可以定义C宏,以便提供紧凑的表单。