nsassert()是乙個巨集,用於開發階段除錯程式中的bug,通過為nsassert()傳遞條件表示式來斷定是否屬於bug,滿足條件返回真值,程式繼續執行,如果返回假值,則丟擲異常,並且可以自定義異常描述。
nsassert()是這樣定義的:
#define nsassert(condition, desc)
condition是條件表示式,值為yes或no;desc為異常描述,通常為nsstring。當conditon為yes時程式繼續執行,為no時,則丟擲帶有desc描述的異常資訊。nsassert()可以出現在程式的任何乙個位置。
nsassert和assert 區別
nsassert和assert都是斷言,主要的差別是assert在斷言失敗的時候只是簡單的終止程式,而nsassert會報告出錯誤資訊並且列印出來.所以只使用nsassert就好,可以不去使用assert。
nsassert/nscassert
ios中用的最多的是兩對斷言, nsassert/nscassert 和 nsparameterassert/nscparameterassert. 要知道他們的區別,我們先來看看他們定義.
#if !defined(ns_block_assertions)
#if !defined(_nsassertbody)
#define nsassert(condition, desc, ...) \\\\
do \\\\
__pragma_pop_no_extra_arg_warnings \\\\
} while(0)
#endif
#if !defined(_nscassertbody)
#define nscassert(condition, desc, ...) \\\\
do \\\\
__pragma_pop_no_extra_arg_warnings \\\\
} while(0)
#endif
從定義可以看出來,前者是適合於objectc的方法,_cmd 和 self 與執行時有關. 後者是適用於c的函式。
nsparameterassert/nscparameterassert 兩者的區別也是前者適用於objective-c的方法,後者適用於c的函式。
實際開發中就用前者就可以了。
nsassert/nscassert 和 nsparameterassert/nscparameterassert 的區別是前者是針對條件斷言, 後者只是針對引數是否存在的斷言, 除錯時候可以結合使用,先判斷引數,再進一步斷言,確認原因.
nsassert的用法
int a = 1;
nscassert(a == 2, @"a must equal to 2"); //第乙個引數是條件,如果第乙個引數不滿足條件,就會記錄並列印後面的字串
執行則會崩潰並在控制台輸出資訊如下:
*** assertion failure in -[viewcontroller viewdidload](), /users/yinwentao
/desktop/myassert/myassert/viewcontroller.m:
32'a must equal to 2'
nsparameterassert的用法- (void)assertwithpara:(nsstring *)str
如果 呼叫方法 assertwithpara: 傳入引數為空則有如下日誌
*** assertion failure in -[viewcontroller assertwithpara:], /users/yinwentao
/desktop/myassert/myassert/viewcontroller.m:
45'invalid parameter not satisfying: str'
日誌中的數字是告訴你 第多少行**出錯了。
xcode 已經預設將release環境下的斷言取消了, 免除了忘記關閉斷言造成的程式不穩定. 所以不用擔心 在開發時候大膽使用。
自定義nsassertionhandler
nsassertionhandler例項是自動建立的,用於處理錯誤斷言。如果 nsassert和nscassert條件評估為錯誤,會向 nsassertionhandler例項傳送乙個表示錯誤的字串。每個執行緒都有它自己的nsassertionhandler例項。
我們可以自定義處理方法,從而使用斷言的時候,控制台輸出錯誤,但是程式不會直接崩潰。
#import "myasserthandler.h"
@implementation
myasserthandler
//處理objective-c的斷言
- (void)handlefailureinmethod:(sel)selector object:(id)object file:(nsstring *)filename linenumber:(nsinteger)line description:(nsstring *)format,...
//處理c的斷言
- (void)handlefailureinfunction:(nsstring *)functionname file:(nsstring *)filename linenumber:(nsinteger)line description:(nsstring *)format,...
@end
給執行緒新增處理類
nsassertionhandler *myhandler = [[myasserthandler alloc] init];
//給當前的執行緒
[[[nsthread currentthread] threaddictionary] setvalue:myhandler
forkey:nsassertionhandlerkey];
自定義nsassertionhandler後,程式能夠獲得斷言失敗後的資訊,但是程式可以繼續執行,不會強制退出程式. NSAssert斷言的使用
nsassert斷言的使用,即可以使用nsassert進行變數等的異常判斷,在開發環境中避免 異常,造成在真機中使用時造成閃退。作用相當於對變數使用條件語句進行有效判斷。使用nsassert斷言時,如果非真時,在模擬器會停止繼續執行,且跳轉到異常 處 而在真機中則不會。nsassert self.f...
NSAssert斷言的簡單使用
斷言 保證某乙個條件一定滿足,如果不滿足,就崩潰,並且列印自定義的崩潰資訊。用法 1 引數1 條件表示式,yes 程式繼續執行 no 應用崩潰並列印2 引數2 自定義的崩潰資訊,通常為nsstring,控制台會列印 3 nsassert condition,desc,示例 1 urlstring為n...
NSAssert巨集的記錄
nsassert巨集的定義如下,具體看官方文件 define nsassert condition,desc,nsassert是ios裡的乙個巨集定義,通常用來除錯,condition是條件表示式,值為yes或no desc為異常描述,通常為nsstring。當conditon為yes時程式繼續執行...