iOS-NSParameterAssert總結(jié)

一.NSParameterAssert官方解釋

Assertions evaluate a condition and, if the condition evaluates to false, call the assertion handler for the current thread, passing it a format string and a variable number of arguments. Each thread has its own assertion handler, which is an object of classNSAssertionHandler.
When invoked, an assertion handler prints an error message that includes method and class names (or the function name). It then raises anNSInternalInconsistencyException exception.
斷言評(píng)估一個(gè)條件,如果條件為 false 蒂胞,調(diào)用當(dāng)前線程的斷點(diǎn)句柄岳瞭。每一個(gè)線程有它自已的斷點(diǎn)句柄蚊锹,它是一個(gè) NSAsserttionHandler 類的對(duì)象牡昆。當(dāng)被調(diào)用時(shí)丢烘,斷言句柄打印一個(gè)錯(cuò)誤信息,該條信息中包含了方法名播瞳、類名或函數(shù)名赢乓。然后,它就拋出一個(gè) NSInternalInconsistencyException 異常牌芋。

This macro validates a parameter for an Objective-C method. Simply provide the parameter as the condition argument. The macro evaluates the parameter and, if it is false, it logs an error message that includes the parameter and then raises an exception.
這個(gè)宏用于確認(rèn)一個(gè) Objective-C 的方法的有效性肯夏。簡單提供參數(shù)作為條件就行驯击。該宏評(píng)估這個(gè)參數(shù)耐亏,如果為 false 碟贾,它就打印一個(gè)錯(cuò)誤日志信息轨域,該信息包含了參數(shù)并且拋出一個(gè)異常干发。

Assertions are disabled if the preprocessor macro NS_BLOCK_ASSERTIONS is defined. All assertion macros return void.
如果定義了預(yù)處理宏 NS_BLOCK_ASSERTIONS 斷言就被禁止了枉长。所有的斷點(diǎn)宏都返回 void必峰。

  • 斷言是從經(jīng)典的邏輯學(xué)中借用過來的概念。在邏輯學(xué)中凭需,斷言是對(duì)已經(jīng)證明過的命題的陳述。在編程中粒蜈,斷言是指程序員所做出的關(guān)于應(yīng)用程序在它們所聲明的地方的一些假設(shè)枯怖。

  • 當(dāng)用于先驗(yàn)條件和后驗(yàn)條件能力范圍內(nèi)時(shí),斷言形成了一種契約,它描述了代碼在執(zhí)行一個(gè)方法或函數(shù)的開始和結(jié)束時(shí)的狀態(tài)的期望塘淑。斷言也能用于加強(qiáng)運(yùn)行時(shí)的條件槐沼,為了當(dāng)先驗(yàn)條件失敗時(shí)阻止程序運(yùn)行捌治。

  • 斷言與單元測試有些類似肖油,它們都定義了代碼將會(huì)運(yùn)行的期望結(jié)果森枪。與單元測試不同的是,斷言存在于程序本身,并且因此被限定在程序的上下文中筋遭。因?yàn)閱卧獪y試是完全獨(dú)立的暴拄,它們完全有能力通過使用像方法樁和模擬對(duì)象等工具隔離并且單獨(dú)測試特定的行為乖篷。開發(fā)者應(yīng)當(dāng)在應(yīng)該程序中結(jié)合使用合理數(shù)量的斷言和單元測試來測試和定義應(yīng)用程序行為踏施。

二.原理

  • Objective-C 用一個(gè)面向?qū)ο蟮耐緩交旌狭?C 語言風(fēng)格的斷言宏定義來注入和處理斷言失敗罕邀。即:NSAssertionHandler
  • 每個(gè)線程擁有它自己的斷言處理器诉探,它是 NSAssertionHandler 類的實(shí)例對(duì)象肾胯。當(dāng)被調(diào)用時(shí)敬肚,一個(gè)斷言處理器打印一條包含方法和類名(或者函數(shù)名)的錯(cuò)誤信息艳馒。然后它拋出一個(gè) NSInternalInconsistencyException異常弄慰。

三.延伸

基礎(chǔ)類庫中定義了兩套斷言宏:
NSAssert / NSCAssert
NSParameterAssert / NSCParameterAssert

基礎(chǔ)類庫從語義學(xué)上和功能性上使斷言處理器的 API 在兩個(gè)方面區(qū)別開來陆爽。

  • 1.第一個(gè)區(qū)別在于一般斷言(NSAssert)和參數(shù)化斷言(NSParameterAssert)慌闭。方法或函數(shù)應(yīng)當(dāng)在代碼最開始處使用 NSParameterAssert / NSCParameterAssert 來強(qiáng)制輸入的值滿足先驗(yàn)條件驴剔,這是一條金科玉律仔拟;其他情況下使用 NSAssert / NSCAssert利花。

  • 2.第二個(gè)區(qū)別在于 C 和 Objective-C 的斷言:NSAssert 應(yīng)當(dāng)只用于 Objective-C 環(huán)境中(即方法實(shí)現(xiàn)中),而 NSCAssert 應(yīng)當(dāng)只用于 C 環(huán)境中(即函數(shù)中)

    • 當(dāng) NSAssert 或 NSParameterAssert 的條件不滿足時(shí),斷言處理器會(huì)調(diào)用 -handleFailureInMethod:object:file:lineNumber:description:方法权薯。
    • 當(dāng) NSCAssert 或 NSCParameterAssert 的條件不滿足時(shí)盟蚣,斷言處理器會(huì)調(diào)用 -handleFailureInFunction:file:lineNumber:description:方法屎开。

值得注意的是,從 Xcode 4.2 開始蔼两,發(fā)布構(gòu)建默認(rèn)關(guān)閉了斷言额划,它是通過定義 NS_BLOCK_ASSERTIONS 宏實(shí)現(xiàn)的。也就是說茁瘦,當(dāng)編譯發(fā)布版時(shí)甜熔,任何調(diào)用 NSAssert 等的地方都被有效的移除了腔稀。

四.斷言代碼示例

方法一.一般斷言,我們可以這么寫

if (_menuController == nil || _mainController == nil) {
        @throw [NSException exceptionWithName: @"LXDNullInstanceException" reason: @"you can not slide view when one or more of menu view and main view is nil" userInfo: nil];
 }

// 如果其中一個(gè)條件成立,程序崩潰,報(bào)下面的錯(cuò)

//  *** Terminating app due to uncaught exception 'LXDNullInstanceException', 
reason: 'you can not slide view when one or more of menu view and main view is nil'

方法二:NSAssert

 NSAssert(_menuController != nil , @"you can not slide view when one or more of menu view and main view is nil" );
// 方法名   m:118行   報(bào)錯(cuò)描述
// *** Assertion failure in -[LXDSlideManager open], /Users/mac/Downloads/LXDSlideManager.m:118
2016-05-29 17:47:53.655 
LXDSlideMenuObjectiveC[77358:4074358] 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'you can not slide view when one or more of menu view and main view is nil'

方法三: NSParameterAssert

NSParameterAssert((_menuController != nil));
// 方法名   m:118行   報(bào)錯(cuò)描述
// *** Assertion failure in -[LXDSlideManager open], /Users/mac/Downloads/LXDSlideManager.m:118
2016-05-29 17:47:53.655 
LXDSlideMenuObjectiveC[77358:4074358] 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'you can not slide view when one or more of menu view and main view is nil'

注意條件書寫不支持邏輯或語法

// 錯(cuò)誤寫法,不支持邏輯或語法
NSParameterAssert(_menuController != nil || _mainController != nil);
// 錯(cuò)誤寫法,不支持邏輯或語法
 NSAssert(_menuController != nil || _mainController != nil , @"you can not slide view when one or more of menu view and main view is nil" );

參考原文 http://nshipster.cn/nsassertionhandler/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诵闭,一起剝皮案震驚了整個(gè)濱河市瘟芝,隨后出現(xiàn)的幾起案子褥琐,更是在濱河造成了極大的恐慌敌呈,老刑警劉巖造寝,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡浑侥,警方通過查閱死者的電腦和手機(jī)寓落,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門荞下,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仰税,“玉大人陨簇,你說我怎么就攤上這事迹淌“η裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蔓涧,是天一觀的道長蠢笋。 經(jīng)常有香客問我,道長瞻惋,這世上最難降的妖魔是什么歼狼? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任趟咆,我火速辦了婚禮梅屉,結(jié)果婚禮上坯汤,老公的妹妹穿的比我還像新娘。我一直安慰自己惰聂,他們只是感情好疆偿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布搓幌。 她就那樣靜靜地躺著,像睡著了一般溉愁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叉钥,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音投队,去河邊找鬼。 笑死敷鸦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扒披。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愿险,長吁一口氣:“原來是場噩夢啊……” “哼价说!你這毒婦竟也來了辆亏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤扮叨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后彻磁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衷蜓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恍箭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扯夭,死狀恐怖鞍匾,靈堂內(nèi)的尸體忽然破棺而出交洗,到底是詐尸還是另有隱情橡淑,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布梁棠,位于F島的核電站,受9級(jí)特大地震影響符糊,放射性物質(zhì)發(fā)生泄漏凫海。R本人自食惡果不足惜男娄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望模闲。 院中可真熱鬧,春花似錦尸折、人聲如沸啰脚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贮配,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泪勒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工圆存, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沦辙。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像油讯,于是被迫代替她去往敵國和親详民。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陌兑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)兔综,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 簡介 C++98/03的設(shè)計(jì)目標(biāo):一软驰、比C語言更適合系統(tǒng)編程(且與C語言兼容)。二锭亏、支持?jǐn)?shù)據(jù)抽象纠吴。三贰镣、支持面向?qū)ο?..
    認(rèn)真學(xué)計(jì)算機(jī)閱讀 5,325評(píng)論 0 53
  • 19歲,情竇初開的年齡碑隆,你遇到了第一個(gè)他恭陡,初戀的他對(duì)你格外珍惜上煤,百般寵愛休玩。那個(gè)時(shí)候的你驕傲,任性拴疤,拿出百般招數(shù)來考...
    兩只小熊bear閱讀 199評(píng)論 0 0
  • 3月4日苔埋,成都出臺(tái)首個(gè)共享單車規(guī)定蜒犯,明確全體市民要愛護(hù)共享單車和停放設(shè)施等公私財(cái)物组橄,違法要追責(zé)罚随。公安機(jī)關(guān)要加大執(zhí)法...
    navy_閱讀 496評(píng)論 0 5