NSAssert断言

NSAssert与assert

NSAssert和assert是断言,主要的差别是assert在断言失败的时候只是简单的终止程序,而NSAssert会报告出错误信息并且打印出来。

NSAssert与NSCAssert

两者的差别通过定义可以看出来, 前者是适合于Objective-C的方法,_cmd 和 self 与运行时有关. 后者是适用于C的函数。
#if !defined(NS_BLOCK_ASSERTIONS)
#if !defined(_NSAssertBody)
#define NSAssert(condition, desc, ...)
do {
__PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS
if (!(condition)) {
[[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd
object:self file:[NSString stringWithUTF8String:FILE]
lineNumber:LINE description:(desc), ##VA_ARGS];
}
__PRAGMA_POP_NO_EXTRA_ARG_WARNINGS
} while(0)
#endif
#if !defined(_NSCAssertBody)
#define NSCAssert(condition, desc, ...)
do {
__PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS
if (!(condition)) {
[[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithUTF8String:PRETTY_FUNCTION]
file:[NSString stringWithUTF8String:FILE]
lineNumber:LINE description:(desc), ##VA_ARGS];
}
__PRAGMA_POP_NO_EXTRA_ARG_WARNINGS
} while(0)
#endif

NSParameterAssert与NSCparameterAssert

两者的区别也是前者适用于Objective-C的方法,后者适用于C的函数。

NSAssert/NSCAssert 与NSParameterAssert/NSCparameterAssert

区别是前者是所有断言, 后者只是针对参数是否存在的断言, 所以可以先进行参数的断言,确认参数是正确的,再进行所有的断言,确认其他原因。

NOTE:Xcode 已经默认将release环境下的断言取消了, 免除了忘记关闭断言造成的程序不稳定.

NSAssertionHandler 自定义处理方法,程序不会直接崩溃

NSAssertionHandler实例是自动创建的,用于处理错误断言。 如果 NSAssert和NSCAssert条件评估为错误,会向 NSAssertionHandler实例发送一个表示错误的字符串。每个线程都有它自己的NSAssertionHandler实例。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,881评论 18 139
  • NSAssert()是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属...
    啊啊啊啊锋阅读 975评论 0 0
  • NSAssert()是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属...
    小木___Boy阅读 42,783评论 5 103
  • NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否...
    Isy阅读 569评论 0 0
  • 我的愿望是在六十岁的时候和二十岁的孩子一起聊天,不让他们嫌弃我
    荷小胖阅读 167评论 2 0