#define NSAssert(condition, desc, ...)
如果給定條件為假穿稳,則生成一個斷言。
參數(shù):
-
condition
:表達式友浸,計算結果為YES
或者NO
朝扼。 -
desc
:NSString
對象類型的字符串,其中包含一個 printf-style 樣式的字符串苛白,該字符串中包含一條描述失敗條件和占位符參數(shù)的錯誤消息。
斷言(Assertion)是指在開發(fā)期間使用的、讓程序在運行時進行自檢的代碼(通常是一個子程序或宏)论衍。斷言為真,則表明程序運行正常聚磺,而斷言為假坯台,則意味著它已經(jīng)在代碼中發(fā)現(xiàn)了意料之外的錯誤。斷言對于大型的復雜程序或可靠性要求極高的程序來說尤其有用瘫寝。
Assert 用于在代碼中強制執(zhí)行語義約定(編寫“防御性代碼”)蜒蕾,示例代碼:
- (void)doSomethingWithString:(NSString *)string {
NSAssert(string != nil, @"parameters should not be nil");
// ... 執(zhí)行正常流程
}
因此稠炬,它不僅可以安全防范潛在的不良輸入,而且還可以以一種有用的標準方式記錄它們咪啡。
斷言是為了確保一個值是它所應該的值首启。如果斷言失敗了,就意味著哪里出了問題撤摸,因此程序會崩潰退出毅桃。使用 Assert 的一個原因是,如果你有一個函數(shù)准夷,如果傳遞給它的參數(shù)不是某個值(或一個值的范圍)钥飞,你可以使用 Assert 來確保這個值是你所期望的值,如果不是衫嵌,那就意味著真的出了問題读宙,所以應用程序會崩潰退出。Assert 對于調(diào)試/單元測試非常有用楔绞,當你對外提供框架來阻止用戶做 "邪惡 "的事情時结闸,Assert 也是非常有用的。
NSAssert
宏對斷言條件進行評估墓律,并作為斷言處理程序的前端膀估。
每個線程都有自己的斷言處理程序,它是 NSAssertionHandler
對象類型耻讽。當被調(diào)用時察纯,斷言處理程序會打印一條錯誤消息,其中包括方法和類名(或函數(shù)名)针肥。然后它會引發(fā)一個 NSInternalInconsistencyException
異常饼记。如果條件值為 NO
,NSAssert()
宏會在當前線程的斷言處理程序上調(diào)用 handleFailureInMethod:object:file:lineNumber:description:
方法慰枕,并傳遞 desc
參數(shù)作為描述字符串具则。
NSAssert()
宏只能在 Objective-C 語言的方法中使用。
如果定義了預處理程序宏 NS_BLOCK_ASSERTIONS
或者 Xcode 編譯設置(build setting)中的 ENABLE_NS_ASSERTIONS
項被禁用了具帮,那么斷言將被禁用博肋。
重要
不要在這個宏的條件參數(shù)中調(diào)用帶有副作用的函數(shù)(避免把「需要執(zhí)行有效操作的代碼」放到斷言中)。當斷言被禁用時蜂厅,條件參數(shù)不會被評估匪凡,所以如果你調(diào)用了帶有副作用的函數(shù),當你在非調(diào)試配置中構建項目時掘猿,這些函數(shù)可能永遠不會被調(diào)用病游。
從 Xcode 4.2 開始,
release
版默認關閉了斷言稠通。也就是當編譯發(fā)布版時衬衬,任何調(diào)用NSAssert()
的地方都被空行替換买猖。所以,不要在NSAssert()
內(nèi)執(zhí)行任何有效操作滋尉。
Note
并非所有版本的配置都會默認禁用斷言玉控。
如果想要在發(fā)布版中使用 NSAssert()
,可以在 Build Setting 中的 Enable Foundation Assertions 中修改(不建議<孀<樵丁!)讽挟。