断言是指在开发期间使用的、让程序在运行时进行自检的代码(通常是一个子程序或宏)。NSAssert和NSParameterAssert在开发环境中经常被使用,调试和验证代码参数的完整性,断言为真,则表明程序运行正常,断言为假,则意味着它已经在代码中发现了意料之外的错误。一般XCode中的断言在Debug模式默认是开启的,Realse版本中是禁用的。
检查是否是debug模式开启断言,release模式关闭,Build Settings中的设置如下:
断言的使用
NSAssert的简单使用:
从运行结果可以发现程序奔溃,并打印出奔溃在第几行以及原因。
NSParameterAssert(参数断言)的简单使用:
断言为假时自定义处理
断言的原理:
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];
加入之后表示在主线程的代码中的断言被自定义,若是把断言写在其他线程,为假时还是由系统处理