NSAssert和NSParameterAssert

NSAssert和NSParameterAssert在開發(fā)環(huán)境中經(jīng)常被使用斑响,調(diào)試和驗證代碼參數(shù)的完整性,斷言為真,則表明程序運行正常趣斤,而斷言為假,則意味著它已經(jīng)在代碼中發(fā)現(xiàn)了意料之外的錯誤黎休。Xcode中的斷言在Debug模式默認是開啟的浓领,Realse版本中是禁用的.

基礎斷言

基礎類庫中了兩種斷言,NSAssert和NSParameterAssert是OC斷言势腮,NSCAssert和NSCParameterAssert是C語言斷言联贩。先來看一下NSAssert定義:

The NSAssert macro evaluates the condition and serves as a front end to the assertion handler.
Each thread has its own assertion handler, which is an object of class NSAssertionHandler. When invoked, an assertion handler prints an error message that includes the method and class names (or the function name). It then raises an NSInternalInconsistencyException exception. If condition evaluates to NO, the macro invokes handleFailureInMethod:object:file:lineNumber:description: on the assertion handler for the current thread, passing desc as the description string.
This macro should be used only within Objective-C methods.
Assertions are disabled if the preprocessor macro NS_BLOCK_ASSERTIONS is defined.
**Important:Important**
Do not call functions with side effects in the condition parameter of this macro. The condition parameter is not evaluated when assertions are disabled, so if you call functions with side effects, those functions may never get called when you build the project in a non-debug configuration.
**Note:Note**
Not all release configurations disable assertions by default.

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 class NSAssertionHandler. When invoked, an assertion handler prints an error message that includes method and class names (or the function name). It then raises an NSInternalInconsistencyException exception.
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.
Assertions are disabled if the preprocessor macro NS_BLOCK_ASSERTIONS is defined. All assertion macros return void.
**Important:Important**
Do not call functions with side effects in the condition parameter of this macro. The condition parameter is not evaluated when assertions are disabled, so if you call functions with side effects, those functions may never get called when you build the project in a non-debug configuration.
**Note:Note**
Not all release configurations disable assertions by default.

兩者的定義類似,大概意思就是如果是false就會調(diào)用當前線程Assertion Hanlder進行處理捎拯,非Debug模式下可能所有的斷言都不會調(diào)用泪幌,最后一句很重要,并不是所有的發(fā)布配置會禁用斷言署照,如果想看斷言是否禁用祸泪,需要看一下設置:


Snip20160505_1.png

簡單測試:

    NSString *result=@"中山郎";
    NSInteger  count=10;
    NSAssert(count>10, @"總數(shù)必須大于10");
    NSLog(@"斷言執(zhí)行之后");
    
    NSParameterAssert(nil);
    NSParameterAssert(![result isEqualToString:@"FlyElephant"]);
    NSLog(@"Name:%@",result);
    NSParameterAssert([result isEqualToString:@"FlyElephant"]);

崩潰信息:

** FECategory[23811:248235] *** Assertion failure in -[ViewController setupAssert], /ViewController.m:45**
** FECategory[23811:248235] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '****總數(shù)必須大于****10'**

NSAssertionHandler

NSAssert異常處理的時候默認是NSAssertionHandler處理的,不過我們可以自定自己的Handler建芙,實現(xiàn)兩個方法:

- (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(nullable NSString *)format,... NS_FORMAT_FUNCTION(5,6);
- (void)handleFailureInFunction:(NSString *)functionName file:(NSString *)fileName lineNumber:(NSInteger)line description:(nullable NSString *)format,... NS_FORMAT_FUNCTION(4,5);

handleFailureInMethod處理OC方法中的斷言没隘,handleFailureInFunction處理C函數(shù)中的斷言
自定義繼承自NSAssertionHandler的類FEAssertionHandler:

@implementation FEAssertionHandler

-(void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format, ...{
    NSLog(@"FlyElephant-FEAssertionHandler: Method %@ for object %@ in %@--line:%li", NSStringFromSelector(selector), object, fileName, (long)line);
}

-(void)handleFailureInFunction:(NSString *)functionName file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format, ...{
    NSLog(@"FlyElephant-FEAssertionHandler:Function (%@) in %@--line:%li", functionName, fileName, (long)line);
}

@end

AppDelegate中設置斷言處理:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    FEAssertionHandler *hanlder = [[FEAssertionHandler alloc] init];
    [[[NSThread currentThread] threadDictionary] setValue:hanlder forKey:NSAssertionHandlerKey];
    return YES;
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市禁荸,隨后出現(xiàn)的幾起案子右蒲,更是在濱河造成了極大的恐慌,老刑警劉巖屡限,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奴烙,死亡現(xiàn)場離奇詭異均唉,居然都是意外死亡,警方通過查閱死者的電腦和手機窍霞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門罩旋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啊央,“玉大人,你說我怎么就攤上這事涨醋」霞ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵浴骂,是天一觀的道長乓土。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么趣苏? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任狡相,我火速辦了婚禮,結(jié)果婚禮上食磕,老公的妹妹穿的比我還像新娘尽棕。我一直安慰自己,他們只是感情好彬伦,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布滔悉。 她就那樣靜靜地躺著,像睡著了一般单绑。 火紅的嫁衣襯著肌膚如雪回官。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天搂橙,我揣著相機與錄音孙乖,去河邊找鬼。 笑死份氧,一個胖子當著我的面吹牛唯袄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜗帜,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼恋拷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厅缺?” 一聲冷哼從身側(cè)響起蔬顾,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎湘捎,沒想到半個月后诀豁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡窥妇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年舷胜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片活翩。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡烹骨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出材泄,到底是詐尸還是另有隱情沮焕,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布拉宗,位于F島的核電站峦树,受9級特大地震影響辣辫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魁巩,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一急灭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歪赢,春花似錦化戳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至白对,卻和暖如春掠廓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背甩恼。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工蟀瞧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人条摸。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓悦污,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钉蒲。 傳聞我的和親對象是個殘疾皇子切端,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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