- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在我的 iPhone 应用程序中使用 NSAssert
,这样如果出现意外情况,应用程序会快速失败并崩溃并在崩溃日志中显示一条有意义的消息。
如果失败的 NSAssert
在主线程上,这可以正常工作,因为它默认引发 NSInternalInconsistencyException
未被捕获并停止执行。但我也在后台线程中进行处理,在这种情况下 NSAssert
只是中止线程,但程序继续运行。
我目前的解决方案是在主线程中捕获并重新抛出异常(在这种情况下,NSOperation
的main
方法):
- (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/
NSAssert 与 NSAssert 的主要用途是什么?异常。什么时候更推荐? 最佳答案 断言通常仅在开发期间使用,并在 Release模式下从应用程序中编译出来(这由 NS_BLOCK_ASSER
我有几次被发现将函数代码放入 NSAssert 或 NSParameter 断言中,例如 NSParameterAssert( [self doSomeWork] ); 这样做的问题是,当您进行发布构
我有一段代码,其中包含一些仅在 NSAssert 语句中使用的变量。他们检查调试构建更严格执行的方法参数的某些先决条件。这是一个例子: NSString *videoCodec = [outputSe
我正在尝试在我的 iPhone 应用程序中使用 NSAssert,这样如果出现意外情况,应用程序会快速失败并崩溃并在崩溃日志中显示一条有意义的消息。 如果失败的 NSAssert 在主线程上,这可以正
我想知道到处使用 NSAssert 是否是一个好习惯?这样做有什么好处?在什么情况下最好使用它? 最佳答案 广泛使用 NSAssert() 不会将 ObjC 变成 Eiffel,但只要您记住它的实际实
我在代码中使用了相当多的断言,因为它们在调试中很有用,但是 Cocoa 应用程序的标准行为是中断处理并将断言失败记录到控制台。UI 不会崩溃,也不会启动错误对话框,并且通常不明显发生了什么。 使程序崩
正如标题所示,我如何定义一个自定义的 NSAssert ,其中包括行、类和格式,如下面的 NSLog 所示: #define NSLog(__FORMAT__, ...) NSLog((@"%@: "
最近我注意到 NSAssert 只能在 Debug模式下工作。是否有适用于正常构建的模拟? 最佳答案 你是对的。 Xcode 自动关闭发布版本的断言。如果您真的想在您的发布版本中使用它们,您可以从bu
NSAssert 和 NSCAsert 有什么区别?当我探索它们的实现时,它们看起来非常相似,但我找不到问题的答案。 我猜它还会解释 NSParameterAssert 和 NSCParameterA
我不得不问这个,因为:我唯一知道的是,如果断言失败,应用程序就会崩溃。这就是为什么要使用 NSAssert 的原因吗?或者这样做还有什么好处?将 NSAssert 置于我在代码中所做的任何假设之上是否
我经常在 iOS 代码中看到“assert”,我 google 了一下,才知道它断言 true 或 false。 我想知道这是否会在 Release模式下自动禁用? 最佳答案 更新:验证这在 Xcod
我不知道为什么我得到了 use of undeclared identifier _cmd did you mean rcmd 在 NSAssert 所在的那一行。 #import int mai
控制台为不应该的变量打印 me (null),所以我想在那里放一个断言只是为了好玩: NSAssert(myVar, @"myVar was (null)!"); 这里有什么技巧吗?这个(null)东
运行调试器时,NSAssert 在 Xcode 4(最高 4.6)中运行良好。断言触发,您对其断点,然后它输出断言消息。 但是当在调试器之外运行时(在设备上调试构建),断言会触发 - 但没有任何消息。
如果我们在带有 NSLogs 的设备上运行应用程序,那么它可能会在一定程度上降低应用程序的速度。 NSAssert 在内存方面是否与 NSLog 一样? 如有任何意见或建议,我们将不胜感激。 提前谢谢
我想在构建我们的发布 iOS 二进制文件时禁用代码行中发生的 NSAssert 调用,然后我想确认它们已被禁用,因为我 super 偏执。我如何确认它们已被禁用? 为了在我们的发布版本中禁用 NSAs
我们不能在 block 内使用 NSAssertion,因为该宏使用 self,创建一个保留循环,如此处评论: http://www.takingnotes.co/blog/2011/09/27/ma
IIRC,这通常有效。但最近我注意到 NSAssert…() 没有给我堆栈跟踪,或者至少没有提供有用的堆栈跟踪: 2012-02-26 14:41:19.283 MyApp[3299:707] ***
(假设我有充分的理由不删除代码中的 NSAssert() 检查,因为我也在进行单元测试。) 在我的单元测试代码中,我想确保当我调用它时,代码中的 NSAssert 会命中(断言)。因此,我在调用执行断
我认为 NSAssert 不能使用 printf 说明符,但是这个: NSAssert(0, @"%@%@", @"foo", @"bar"); 正如您所期望的那样工作: *** Assertion
我是一名优秀的程序员,十分优秀!