iOS開發中斷言的使用—NSAssert(),iosnsassert

來源:互聯網
上載者:User

iOS開發中斷言的使用—NSAssert(),iosnsassert

 

原文連結:http://blog.csdn.net/univcore/article/details/16859263

斷言(assertion)是指在開發期間使用的、讓程式在運行時進行自檢的代碼(通常是一個子程式或宏)。斷言為真,則表明程式運行正常,而斷言為假,則意味著它已經在代碼中發現了意料之外的錯誤。斷言對於大型的複雜程式或可靠性要求極高的程式來說尤其有用。

有關斷言的詳細資料,推薦大家一定去看《代碼大全2》中“防禦式編程”這一章。下面,摘錄一些代碼大全中有關斷言使用的經典指導性建議:

對來源於內部系統的可靠的資料使用斷言,而不要對外部不可靠的資料使用斷言,對於外部不可靠資料,應該使用錯誤處理代碼。斷言可以看成可執行檔注釋。

系統外部的資料(使用者輸入,檔案,網路讀取等等)都是不可信的,需要嚴格檢查(通常是錯誤處理)才能允許存取到系統內部,這相當於一個守衛。而對於系統內部的互動(比如子程式調用),如果每次也都去處理輸入的資料,也就相當於系統沒有可信的邊界了,會讓代碼變的臃腫複雜;而事實上,在系統內部,傳遞給子程式預期的恰當資料應該是調用者的責任,系統內的調用者應該確保傳遞給子程式的資料是恰當可以正常工作的。這樣一來,就隔離了不可靠的外部環境和可靠的系統內部環境,降低複雜度。

但是在開發階段,代碼極可能包含缺陷,也許是處理外部資料的程式考慮的不夠周全,也許是調用系統內部子程式的代碼存在錯誤,造成子程式調用失敗。這個時候,斷言就可以發揮作用,用來確診到底是那部分出現了問題而導致子程式調用失敗。在清理了所有缺陷之後,內外有別的信用體系就建立起來。等到發行版時候,這些斷言就應該沒有存在必要。

 

在iOS開發中,可以使用宏NSAssert()在程式中進行斷言處理。NSAssert()使用正確,可以協助開發人員儘快定位bug。開發人員沒有必要在應用程式的每個版本中都進行斷言檢查,這是因為大多數項目都是有兩個版本:Debug版和Release版。在Debug版中,開發人員希望所有的斷言都檢查到,而在Release版中,往往都是禁用斷言檢查的。設定Release版本中禁用斷言的方法如下:

在Build Settings菜單,找到Preprocessor Macros項,Preprocessor Macros項下面有一個選擇,用於程式組建組態:Debug版和Release版。選擇 Release項,設定NS_BLOCK_ASSERTIONS,不進行斷言檢查。如所示。

下面,我們在一個 列印名字的函數裡面,加入斷言,以使程式在發現輸入的名字為空白時,拋出異常。

 

[objc] view plain copy print?
  1. - (void)printMyName:(NSString *)myName  
  2. {  
  3.     NSAssert(myName != nil, @"名字不可為空!");  
  4.     NSLog(@"My name is %@.",myName);  
  5. }  

當傳給函數的參數(myName)為空白時,斷言將被執行,程式Crash,並列印出斷言中的描述資訊。本例中,在控制台列印出了如下的日誌:

 

 

NSAssert[1268:a0b] *** Assertion failure in -[ViewController printMyName:]  

NSAssert/NSAssert/ViewController.m:38

2013-11-21 13:56:01.927 NSAssert[1268:a0b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '名字不可為空!'

斷言告訴我們,傳入的參數不可為空,通過這個報錯很容易就能確定錯誤發生的原因及位置。

如果,我們傳入非空的參數,則程式會正確列印出傳入的名字:

My name is UnivCore.

下面,我們將測試程式設定為Release版本,依據之前的設定,即使當傳入的參數為空白時,斷言也不會被執行。設定為Release版本的方法如下:

依次點擊Product->Scheme->Edit Scheme...(也可以直接按快速鍵command + shift + ,),選擇Run 項,然後在Info面板上修改Build Configuration為Release,就可以將當前的組建組態改為Release。然後,產生並運行程式,就會產生Release版本的程式。注意,對於Archive 項,預設的組建組態就是Release。

此時,我們再運行程式,程式會列印如下語句:

My name is (null).

這說明,斷言代碼沒有運行。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.