Objective-C 編程:NSAssert

#define NSAssert(condition, desc, ...)

如果給定條件為假穿稳,則生成一個斷言。

參數(shù):

  • condition:表達式友浸,計算結果為 YES 或者 NO朝扼。
  • descNSString 對象類型的字符串,其中包含一個 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 異常饼记。如果條件值為 NONSAssert() 宏會在當前線程的斷言處理程序上調(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 中修改(不建議<孀<樵丁!)讽挟。

參考

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丸冕,隨后出現(xiàn)的幾起案子耽梅,更是在濱河造成了極大的恐慌,老刑警劉巖胖烛,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眼姐,死亡現(xiàn)場離奇詭異,居然都是意外死亡佩番,警方通過查閱死者的電腦和手機众旗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趟畏,“玉大人贡歧,你說我怎么就攤上這事「承悖” “怎么了利朵?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猎莲。 經(jīng)常有香客問我绍弟,道長,這世上最難降的妖魔是什么著洼? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任樟遣,我火速辦了婚禮,結果婚禮上身笤,老公的妹妹穿的比我還像新娘豹悬。我一直安慰自己,他們只是感情好展鸡,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布屿衅。 她就那樣靜靜地躺著,像睡著了一般莹弊。 火紅的嫁衣襯著肌膚如雪涤久。 梳的紋絲不亂的頭發(fā)上涡尘,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音响迂,去河邊找鬼考抄。 笑死,一個胖子當著我的面吹牛蔗彤,可吹牛的內(nèi)容都是我干的川梅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼然遏,長吁一口氣:“原來是場噩夢啊……” “哼贫途!你這毒婦竟也來了?” 一聲冷哼從身側響起待侵,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丢早,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秧倾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怨酝,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年那先,在試婚紗的時候發(fā)現(xiàn)自己被綠了农猬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡售淡,死狀恐怖斤葱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勋又,我是刑警寧澤苦掘,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站楔壤,受9級特大地震影響鹤啡,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蹲嚣,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一递瑰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隙畜,春花似錦抖部、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春俯萎,著一層夾襖步出監(jiān)牢的瞬間傲宜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工夫啊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留函卒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓撇眯,卻偏偏與公主長得像报嵌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熊榛,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354