关于 Xcode 中 NSAssert() 的用法 ,以及 assert() 与 NDEBUG
来源:互联网 发布:sql server select if 编辑:程序博客网 时间:2024/06/04 18:21
关于 Xcode 中 NSAssert() 的用法 ,以及 assert() 与 NDEBUG,有需要的朋友可以参考下。
assert(e) 是 C 语言里面的 宏 , 这个 宏的 定义 是 限制在 NDEBUG 条件 下的 ;
在没有定义 NDEBUG 宏的时候 会替换成 一行 三位运算符表达式 e? 0 : printf ( 文件,行号,方法名); abort();
如果定义了 NDEBUG宏 ,assert(e) 就会被替换成 一行 没有实际意义的 字符 比如 空格,或者 空函数。
相信大家都能看明白了吧,没有定义 NDEBUG 的情况下,如果 e 为 0 ,就会 调用 后面的 两行函数,输出 当前 代码 信息,并 执行 abort 终止 进程。
NDEBUG 这个 宏 是为了 区分发布 和 测试 环境的 ,任何人都不希望 在 release 版本中 还 有 assert() 来 捣乱 。 发布时 把 这个NDEBUG 定义一下 就可以 了,也不用 一行一行的去删除 assert()。
abort();是C语言标准 函数 ,这个函数 会导致 进程异常终止 ,也就是说 , abort 后面的 时间里 app 将没有任何代码可以执行。 系统 会 根据 系统设置 决定后续的操作,比如生成 该程序对应的 coredump 文件(也就是 崩溃日志)。
coredump 文件 里面 是 程序 崩溃时候的 现场 , 比如 寄存器 信息,函数调用 栈 列表 等 , 程序员 拿到这个 coredumb 里面的 信息 就可以 定位 到具体的 出问题的 code 。
NSAssert 在 Objective - c 里面 也是 宏,他的做用 跟 assert() 几乎一样 ,release 模式下 就 什么也不执行 ,debug 就会 断言 。(release模式下 xcode定义了一个宏 NS_BLOCK_ASSERTIONS ,这个 宏 跟 c 里面的 NDEBUG 异曲同工)
NSAssert(condition,desc) , 在 debug模式下 被翻译成
if (!(condition)) { \
[[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd \
object:self file:[NSString stringWithUTF8String:__FILE__] \
lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]; \
}
具体执行的操作就是 打印出 文件名 ,函数名 ,行号 , 然后 抛出 异常NSInternalInconsistencyException.
- 关于 Xcode 中 NSAssert() 的用法 ,以及 assert() 与 NDEBUG
- 关于 Xcode 中 NSAssert() 的用法 ,以及 assert() 与 NDEBUG
- debug 与ndebug的区别,assert用法
- ndebug与debug及assert()的用法
- Xcode 中 NSAssert() 的用法
- 关于assert, _DEBUG 与 NDEBUG
- NDEBUG 、DEBUG宏 和assert() 的用法
- assert 与NDEBUG
- 系统assert与NDEBUG
- [C++]NDEBUG宏与assert行为
- [C++]NDEBUG宏与assert行为
- 在Release版的程序中,定义NDEBUG之后,assert就不工作
- NSAssert()的用法
- assert的用法以及与条件语句的比较
- assert and NDEBUG
- # define NDEBUG assert
- gcc assert ndebug
- c++中assert断言的用法与注意事项
- Win7没有telnet怎么办
- VC运行时库(/MD、/MT等)
- openstack dashboard vip没有启动的问题解决
- BZOJ 2705 Longge的问题(欧拉函数)
- UIImageJPEGRepresentation和UIImagePNGRepresentation
- 关于 Xcode 中 NSAssert() 的用法 ,以及 assert() 与 NDEBUG
- iOS 中C如何调用Objective c的代码更新界面问题解决
- 巴什博弈
- 正态贝叶斯分类器
- 覆盖jar 类 优先级高于jar == Debug jar包 java技巧
- iOS GCD的用法
- 3.17 vb 另外一种等量变换 (随机)ROM
- android 图片缓存LruCache(二)
- Rgeliomp程序IVF的生成