iOS之斷言 NSAssert 的使用

2021-08-21 01:12:54 字數 3069 閱讀 4206

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時程式繼續執行...