iOS开发中的断言(NSAssert和NSParameterAssert)

断言是指在开发期间使用的、让程序在运行时进行自检的代码(通常是一个子程序或宏)。NSAssert和NSParameterAssert在开发环境中经常被使用,调试和验证代码参数的完整性,断言为真,则表明程序运行正常,断言为假,则意味着它已经在代码中发现了意料之外的错误。一般XCode中的断言在Debug模式默认是开启的,Realse版本中是禁用的。

检查是否是debug模式开启断言,release模式关闭,Build Settings中的设置如下:

iOS开发中的断言(NSAssert和NSParameterAssert)_第1张图片

断言的使用

NSAssert的简单使用:

测试代码
运行结果

从运行结果可以发现程序奔溃,并打印出奔溃在第几行以及原因。

NSParameterAssert(参数断言)的简单使用:

测试代码
iOS开发中的断言(NSAssert和NSParameterAssert)_第2张图片
运行结果


断言为假时自定义处理

断言的原理:

1.Objective-C 用一个面向对象的途径混合了 C 语言风格的断言宏定义来注入和处理断言失败。即:NSAssertionHandler:

2.每个线程拥有它自己的断言处理器,它是 NSAssertionHandler 类的实例对象。当被调用时,一个断言处理器打印一条包含方法和类名(或者函数名)的错误信息。然后它抛出一个 NSInternalInconsistencyException异常。

3.当 NSAssert 或 NSParameterAssert (OC的断言)的条件不满足时,断言处理器会调用 -handleFailureInMethod:object:file:lineNumber:description:方法。

当 NSCAssert 或 NSCParameterAssert (C的断言)的条件不满足时,断言处理器会调用 -handleFailureInFunction:file:lineNumber:description:方法。

自定义处理断言(OC)的步骤:

1.自定义继承自NSAssertionHandler的类YYAssertionHandler,在YYAssertionHandler中重写 - (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format, ...方法。

若断言为假,在该方法中会返回:

selector:发生错误的方法

 object:发生错误的类  

fileName:发生错误类的文件路径  

line: 发生错误所在行  

format:错误原因

在该方法中我们可以自己写当断言为假时需要做的操作(比如抛出异常)

2.在AppDelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入如下代码:

YYAssertionHandler *handler = [[YYAssertionHandler alloc] init];

    [[[NSThread currentThread] threadDictionary] setValue:handler forKey:NSAssertionHandlerKey];

加入之后表示在主线程的代码中的断言被自定义,若是把断言写在其他线程,为假时还是由系统处理

你可能感兴趣的:(iOS开发中的断言(NSAssert和NSParameterAssert))