关于 Xcode 中 NSAssert() 的用法 ,以及 assert() 与 NDEBUG

来源:互联网 发布:河南知春商贸有限公司 编辑:程序博客网 时间:2024/06/05 01:00

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
原创粉丝点击