iOS日常开发之断言(NSAssert)
断言是指在开发期间使用的、让程序在运行时进行自检的代码(通常是一个子程序或宏)。NSAssert和NSParameterAssert在开发环境中经常被使用,调试和验证代码参数的完整性,断言为真,则表明程序运行正常,断言为假,则意味着它已经在代码中发现了意料之外的错误。一般XCode中的断言在Debug模式默认是开启的,Realse版本中是禁用的。
检查是否是debug模式开启断言,release模式关闭,Build Settings中的设置如下:
断言的使用
NSAssert的简单使用:
NSString *str = nil;
NSAssert(str != nil, @"字符串错误");
运行结果:
Ceshi[433:15358] *** Assertion failure in -[LoginView bindViewModel], /Ceshi/ViewController/login/LoginView.m:209
Ceshi[433:15358] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '字符串错误'
*** First throw call stack:
(0x1c1a1f180 0x1c0bf79f8 0x1c193888c 0x1c23fcb38 0x1009d0628 0x1009cf964 0x100bd2820 0x100b44108 0x100b43340 0x100b42e28 0x1edc63224 0x1edbd3664 0x1edbd396c 0x1edbd48a8 0x1edbd5b3c 0x1edbb8d4c 0x1ee6a4170 0x1c5f5cc60 0x1c5f61c08 0x1c5ec43e4 0x1c5ef2620 0x1c5ef315c 0x1c19b04fc 0x1c19ab224 0x1c19ab7a0 0x1c19aafb4 0x1c3bac79c 0x1ee20cc38 0x100b8a148 0x1c146e8e0)
libc++abi.dylib: terminating with uncaught exception of type NSException
断言为假时自定义处理
断言的原理:
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的类LHAssertionHandler,在LHAssertionHandler中重写下面方法
- (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方法中加入如下代码:
LHAssertionHandler *handler = [[LHAssertionHandler alloc] init];
[[[NSThread currentThread] threadDictionary] setValue:handler forKey:NSAssertionHandlerKey];
加入之后表示在主线程的代码中的断言被自定义,若是把断言写在其他线程,为假时还是由系统处理
注意
条件书写不支持逻辑或语法
// 错误写法,不支持逻辑或语法
NSParameterAssert(str1 != nil || str2 != nil);
// 错误写法,不支持逻辑或语法
NSAssert(str1 != nil || str2 != nil , @"字符串str1或str2为nil" );
本文地址:https://blog.csdn.net/lihao_ios/article/details/107356416
上一篇: 黄米是粗粮吗,对人体有哪些营养价值
下一篇: 从集合的无序性看待关系型数据库中的"序"