NSAssert與assert
NSAssert和assert是斷言厉亏,主要的差別是assert在斷言失敗的時候只是簡單的終止程序,而NSAssert會報(bào)告出錯誤信息并且打印出來凭疮。
NSAssert與NSCAssert
兩者的差別通過定義可以看出來, 前者是適合于Objective-C的方法,_cmd 和 self 與運(yùn)行時有關(guān). 后者是適用于C的函數(shù)。
#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
兩者的區(qū)別也是前者適用于Objective-C的方法,后者適用于C的函數(shù)偶垮。
NSAssert/NSCAssert 與NSParameterAssert/NSCparameterAssert
區(qū)別是前者是所有斷言, 后者只是針對參數(shù)是否存在的斷言, 所以可以先進(jìn)行參數(shù)的斷言,確認(rèn)參數(shù)是正確的,再進(jìn)行所有的斷言,確認(rèn)其他原因。
NOTE:Xcode 已經(jīng)默認(rèn)將release環(huán)境下的斷言取消了, 免除了忘記關(guān)閉斷言造成的程序不穩(wěn)定.
NSAssertionHandler 自定義處理方法,程序不會直接崩潰
NSAssertionHandler實(shí)例是自動創(chuàng)建的帝洪,用于處理錯誤斷言似舵。 如果 NSAssert和NSCAssert條件評估為錯誤,會向 NSAssertionHandler實(shí)例發(fā)送一個表示錯誤的字符串葱峡。每個線程都有它自己的NSAssertionHandler實(shí)例砚哗。