iOS-NSParameterAssert总结

一.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.
断言评估一个条件,如果条件为 false ,调用当前线程的断点句柄。每一个线程有它自已的断点句柄,它是一个 NSAsserttionHandler 类的对象。当被调用时,断言句柄打印一个错误信息,该条信息中包含了方法名、类名或函数名。然后,它就抛出一个 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.
这个宏用于确认一个 Objective-C 的方法的有效性。简单提供参数作为条件就行。该宏评估这个参数,如果为 false ,它就打印一个错误日志信息,该信息包含了参数并且抛出一个异常。

Assertions are disabled if the preprocessor macro NS_BLOCK_ASSERTIONS is defined. All assertion macros return void.
如果定义了预处理宏 NS_BLOCK_ASSERTIONS 断言就被禁止了。所有的断点宏都返回 void。

  • 断言是从经典的逻辑学中借用过来的概念。在逻辑学中,断言是对已经证明过的命题的陈述。在编程中,断言是指程序员所做出的关于应用程序在它们所声明的地方的一些假设。

  • 当用于先验条件和后验条件能力范围内时,断言形成了一种契约,它描述了代码在执行一个方法或函数的开始和结束时的状态的期望。断言也能用于加强运行时的条件,为了当先验条件失败时阻止程序运行。

  • 断言与单元测试有些类似,它们都定义了代码将会运行的期望结果。与单元测试不同的是,断言存在于程序本身,并且因此被限定在程序的上下文中。因为单元测试是完全独立的,它们完全有能力通过使用像方法桩和模拟对象等工具隔离并且单独测试特定的行为。开发者应当在应该程序中结合使用合理数量的断言和单元测试来测试和定义应用程序行为。

二.原理

  • Objective-C 用一个面向对象的途径混合了 C 语言风格的断言宏定义来注入和处理断言失败。即:NSAssertionHandler
  • 每个线程拥有它自己的断言处理器,它是 NSAssertionHandler 类的实例对象。当被调用时,一个断言处理器打印一条包含方法和类名(或者函数名)的错误信息。然后它抛出一个 NSInternalInconsistencyException异常。

三.延伸

基础类库中定义了两套断言宏:
NSAssert / NSCAssert
NSParameterAssert / NSCParameterAssert

基础类库从语义学上和功能性上使断言处理器的 API 在两个方面区别开来。

  • 1.第一个区别在于一般断言(NSAssert)和参数化断言(NSParameterAssert)。方法或函数应当在代码最开始处使用 NSParameterAssert / NSCParameterAssert 来强制输入的值满足先验条件,这是一条金科玉律;其他情况下使用 NSAssert / NSCAssert。

  • 2.第二个区别在于 C 和 Objective-C 的断言:NSAssert 应当只用于 Objective-C 环境中(即方法实现中),而 NSCAssert 应当只用于 C 环境中(即函数中)

    • 当 NSAssert 或 NSParameterAssert 的条件不满足时,断言处理器会调用 -handleFailureInMethod:object:file:lineNumber:description:方法。
    • 当 NSCAssert 或 NSCParameterAssert 的条件不满足时,断言处理器会调用 -handleFailureInFunction:file:lineNumber:description:方法。

值得注意的是,从 Xcode 4.2 开始,发布构建默认关闭了断言,它是通过定义 NS_BLOCK_ASSERTIONS 宏实现的。也就是说,当编译发布版时,任何调用 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];
 }

// 如果其中一个条件成立,程序崩溃,报下面的错

//  *** 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行   报错描述
// *** 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行   报错描述
// *** 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(_menuController != nil || _mainController != nil);
// 错误写法,不支持逻辑或语法
 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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336

推荐阅读更多精彩内容