Xcode 中 NSAssert() 的用法

来源:互联网 发布:java开源审批流源代码 编辑:程序博客网 时间:2024/05/29 19:46

关于 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.

0 0
原创粉丝点击