- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道到处使用 NSAssert 是否是一个好习惯?这样做有什么好处?在什么情况下最好使用它?
最佳答案
广泛使用 NSAssert()
不会将 ObjC 变成 Eiffel,但只要您记住它的实际实现方式和作用,它仍然是一个相当好的实践。关于 NSAssert()
需要记住的事情:
默认情况下,Xcode 在 Release模式下不会关闭 NSAssert()
。您必须记住将 NS_BLOCK_ASSERTIONS
添加到 xcconfig 中的 GCC_PREPROCESSOR_DEFINITIONS
中。 (你是 using xcconfigs ,对吧?)一个常见的问题是在 nil 悄悄起作用的情况下断言非 nil ;这可能意味着本可以顺利恢复的事物会发生现场崩溃。这与 assert()
使用的 NDEBUG
宏无关,如果您的代码包含两种类型的断言,则必须记住定义这两者。
如果您在 Release模式下编译 NSAssert()
,那么当客户向您发送日志时,您不会得到任何指示,表明问题发生在哪里。我个人将 NSAssert()
封装在我自己的宏中,这些宏始终记录日志,即使在 Release模式下也是如此。
NSAssert()
通常会强制执行重复的逻辑。考虑测试 C++ 指针是否为 NULL 的情况。您使用 NSAssert()
,但您仍然还需要使用简单的 if()
测试以避免现场崩溃。这种重复的代码可能成为错误的根源,并且我见过由于断言不再有效而失败的代码。 (幸运的是,这通常处于 Debug模式!)我已经争论了很多如何创建一个将断言和 if() 结合起来的宏,但是很难做到不脆弱或使代码变得困难来理解。
由于上一期,我通常将“NSAssert(NO, ...)
”放在 else{}
子句中,而不是在顶部执行断言方法。这并不理想,因为它将契约(Contract)从方法签名中移开(从而减少了其文件效益),但这是我在实践中发现的最有效的方法。
关于iphone - 断言或 NSAssert 在实践中有何用处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1374474/
我通常不会这样做,但我目前正在从事的项目需要几个位于 c 源文件中的函数。 extern "C" { int words(char sentence[]); int match(cha
我是一名优秀的程序员,十分优秀!