IOS中的断言的使用-NSAssert()

断言(assert) 是指在开发过程是使用的,让程序在运行时进行自检的代码 (通常是一个子程序或宏). 断言为真,则表明程序运行正常,而断言为假,则意味着它已经在代码中发现了意料之外的错误.断言对于大型的复杂程序或可靠性要求极高的程序来说尤其有用.

下面是<<代码大全>>中的防御式编程中的有关断言的指导性意见:

1.用错误处理代码来处理预期会发生的状况,用断言来处理所不应该发生的状况

2.避免把需要执行的代码放到断言中

3.用断言来注解并验证前条件和后条件

4.对于高健壮性的代码,应该先使用断言再处理错误

对来源于内部系统的可靠的数据使用断言,而不要对外部不可靠的数据使用断言,对于外部不可靠数据,应该使用错误处理代码。断言可以看成可执行的注释。

系统外部的数据(用户输入,文件,网络读取等等)都是不可信的,需要严格检查(通常是错误处理)才能放行到系统内部,这相当于一个守卫。而对于系统内部的交互(比如子程序调用),如果每次也都去处理输入的数据,也就相当于系统没有可信的边界了,会让代码变的臃肿复杂;而事实上,在系统内部,传递给子程序预期的恰当数据应该是调用者的责任,系统内的调用者应该确保传递给子程序的数据是恰当可以正常工作的。这样一来,就隔离了不可靠的外部环境和可靠的系统内部环境,降低复杂度。

但是在开发阶段,代码极可能包含缺陷,也许是处理外部数据的程序考虑的不够周全,也许是调用系统内部子程序的代码存在错误,造成子程序调用失败。这个时候,断言就可以发挥作用,用来确诊到底是那部分出现了问题而导致子程序调用失败。在清理了所有缺陷之后,内外有别的信用体系就建立起来。等到发行版时候,这些断言就应该没有存在必要。

在iOS开发中,可以使用宏NSAssert()在程序中进行断言处理。NSAssert()使用正确,可以帮助开发者尽快定位bug。开发者没有必要在应用程序的每个版本中都进行断言检查,这是因为大多数项目都是有两个版本:Debug版和Release版。在Debug版中,开发者希望所有的断言都检查到,而在Release版中,往往都是禁用断言检查的。设置Release版本中禁用断言的方法如下:

在Build Settings菜单,找到Preprocessor Macros项,Preprocessor Macros项下面有一个选择,用于程序生成配置:Debug版和Release版。选择 Release项,设置NS_BLOCK_ASSERTIONS,不进行断言检查。如下图所示。


下面,我们在一个 打印名字的函数里面,加入断言,以使程序在发现输入的名字为空时,抛出异常。

- (void)printMyName:(NSString*)myName

{

NSAssert(myName !=nil,@"名字不能为空!");

NSLog(@"My name is %@.",myName);

}

当传给函数的参数(myName)为空时,断言将被执行,程序Crash,并打印出断言中的描述信息。本例中,在控制台打印出了如下的日志:

NSAssert[1268:a0b] *** Assertion failure in -[ViewController printMyName:]

NSAssert/NSAssert/ViewController.m:38

2013-11-21 13:56:01.927 NSAssert[1268:a0b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '名字不能为空!'

断言告诉我们,传入的参数不能为空,通过这个报错很容易就能确定错误发生的原因及位置。

如果,我们传入非空的参数,则程序会正确打印出传入的名字:

My name is UnivCore.

下面,我们将测试程序设置为Release版本,依据之前的设定,即使当传入的参数为空时,断言也不会被执行。设置为Release版本的方法如下:

依次点击Product->Scheme->Edit Scheme...(也可以直接按快捷键command + shift + ,),选择Run 项,然后在Info面板上修改Build Configuration为Release,就可以将当前的生成配置改为Release。然后,生成并运行程序,就会生成Release版本的程序。注意,对于Archive 项,默认的生成配置就是Release。

此时,我们再运行程序,程序会打印如下语句:

My name is (null).

这说明,断言代码没有运行。本文出处:blog.csdn.net/univcore/article/details/16859263

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,083评论 19 139
  • NSAssert 这个应该都比较熟悉,他的名字叫做“断言”。断言(assertion)是指在开发期间使用的、让程序...
    细雨听风阅读 1,024评论 0 3
  • 史上最全的iOS面试题及答案 迷途的羔羊--专为路痴量身打造的品牌。史上最精准的定位。想迷路都难!闪电更新中......
    南虞阅读 1,562评论 0 8
  • 【NO 再见】 【NO 腐败】 【SAY NO】 【NO 平凡】 【NO 将就】 【NO 平庸】 【NO 宅】 【...
    春分阅读 220评论 0 1
  • 大人只是在忍,只是在忙着大人们的事,只是用故作坚强来承担年龄的重担,大人们也会疼。 在胡同里,时间能让人成为朋友,...
    惜茜阅读 177评论 0 0