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实例。