- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
运行调试器时,NSAssert 在 Xcode 4(最高 4.6)中运行良好。断言触发,您对其断点,然后它输出断言消息。
但是当在调试器之外运行时(在设备上调试构建),断言会触发 - 但没有任何消息。
这使得断言变得毫无用处:您可以看到断言的行号,但是来自程序员的详细消息已被删除。
这是 Xcode 问题吗? clang/LLVM 问题?这是一个错误值的设置吗?或者有解决方法吗?
示例代码:
NSAssert(FALSE, @"X was invalid: %i", x );
示例输出(控制台):
<Warning>: *** Assertion failure in -[myClass method:], myClass.m:124
<Notice>: Formulating crash report for process MyApp[82]
预期输出(控制台):
<Warning>: *** Assertion failure in -[myClass method:], myClass.m:124
<Warning>: *** "X was invalid: -435"
<Notice>: Formulating crash report for process MyApp[82]
注意:我只是在猜测 Apple 将如何格式化断言消息。
更新:发现问题。我的原始描述有误:
在调试器中运行时,消息没有输出到控制台
最佳答案
两个观察:
NSAssert
仅用于调试目的。当您构建应用的发布版本时,NSAssert
不执行任何操作。
当您在设备上运行的应用程序的调试构建中使用 NSAssert
时(不是通过调试器),消息位于设备的控制台中,而不是 Xcode 的控制台中。如果您转到 Xcode 中的“管理器”,选择“设备”,选择您的设备并查看“控制台”,您会在那里看到您的断言。
例如,我在“断言测试”应用程序中放入了一行代码:
NSAssert(FALSE, @"Assertion performed here");
当我通过 Xcode 的管理器查看设备的“控制台”时,我看到:
Aug 6 09:10:53 Rob-iPod amfid[200] : Aug 6 09:10:53 SecTrustEvaluate [leaf CriticalExtensions IssuerCommonName]Aug 6 09:10:53 Rob-iPod Assertion Test[199] : *** Assertion failure in -[ViewController viewDidLoad], /Users/rryan/Documents/Development/Xcode/Assertion Test/Assertion Test/ViewController.m:21Aug 6 09:10:53 Rob-iPod kernel[0] : launchd[199] Builtin profile: container (sandbox)Aug 6 09:10:53 Rob-iPod kernel[0] : launchd[199] Container: /private/var/mobile/Applications/7A7A62EF-8CEC-4388-932D-5C02DE77B841 (sandbox)Aug 6 09:10:53 Rob-iPod Assertion Test[199] : *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Assertion performed here' *** First throw call stack: (0x315592a3 0x391d797f 0x3155915d 0x31e2eab7 0x843f7 0x33380595 0x333c0d79 0x333bcaed 0x333fe1e9 0x333c183f 0x333b984b 0x33361c39 0x333616cd 0x3336111b 0x350535a3 0x350531d3 0x3152e173 0x3152e117 0x3152cf99 0x3149febd 0x3149fd49 0x333b8485 0x333b5301 0x84149 0x3960eb20)Aug 6 09:10:54 Rob-iPod ReportCrash[201] : Formulating crash report for process Assertion Test[199]Aug 6 09:10:54 Rob-iPod com.apple.launchd[1] (UIKitApplication:com.robertmryan.Assertion-Test[0x7be0][199]) : (UIKitApplication:com.robertmryan.Assertion-Test[0x7be0]) Job appears to have crashed: Abort trap: 6Aug 6 09:10:54 Rob-iPod backboardd[26] : Application 'UIKitApplication:com.robertmryan.Assertion-Test[0x7be0]' exited abnormally with signal 6: Abort trap: 6Aug 6 09:10:54 Rob-iPod ReportCrash[201] : libMobileGestalt copySystemVersionDictionaryValue: Could not lookup ReleaseType from system version dictionaryAug 6 09:10:54 Rob-iPod ReportCrash[201] : Saved crashreport to /var/mobile/Library/Logs/CrashReporter/Assertion Test_2013-08-06-091053_Rob-iPod.plist using uid: 0 gid: 0, synthetic_euid: 501 egid: 0
如果您查看第五行,您会在那里看到断言消息。
关于ios - NSAssert 在调试器中工作,但当直接在设备上运行时,控制台中缺少消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18080742/
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
我是一名优秀的程序员,十分优秀!