iphone - NSAssert 在线程中的使用

标签 iphone objective-c assert nsthread nsoperation

我正在尝试在我的 iPhone 应用程序中使用 NSAssert,这样如果出现意外情况,应用程序会快速失败并崩溃并在崩溃日志中显示一条有意义的消息。

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

我目前的解决方案是在主线程中捕获并重新抛出异常(在这种情况下,NSOperationmain 方法):

- (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];
    }
}

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

我知道我可以将 C 的 assert 与静态注释一起使用:

assert(x > 20 && "x should be greater than 20");

但这不允许我显示 x 的实际失败值是多少。

最佳答案

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

注意:您甚至可以定义一个 C 宏,以提供紧凑的形式。

关于iphone - NSAssert 在线程中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2015788/

相关文章:

objective-c - 在应用程序委托(delegate)内执行初始 View Controller 的序列

ios - SpriteBuilder 时间线自动播放动画未运行

objective-c - 如何在文件名中使用十六进制计数进行编程加载?

iphone - 阻止 iCloud 备份

ios - 是否可以从 UIImage 中剥离或完全删除 UIImageOrientation 信息?

java - 为什么我们不能对公共(public)方法使用断言?

c++ - 使用isdigit比较unicode时出现调试断言失败错误

cuda - 在内核调用中使用断言

iphone - iPhone 上的自定义 UITabBarItem 图像/标题

iphone - 如何更改 UISegmentedControl 的字体颜色