程序一般都有BUG,Crash是一种比较严重的BUG。一款优秀的应用程序,要保证没有易现的Crash,并且要保证开发者对Crash的可控性,即可以方便的记录、分析、处理。
上文我们对数组越界进行了补救处理,但是数组越界的问题并没有得到解决,只是做到了不会让程序崩溃但根本问题并没有得到解决,这时候我们就需要一个反馈,能够精确的捕获到crash发生的原因,进而及时的解决问题。
在这里推荐一本必看的书《iOS 性能优化实战》本文内容取自该书第1章 1.5 日志与埋点
在启动应用程序时,可以向系统中注册异常捕获函数 NSSetUncaughtExceptionHandler(&CHExceptionHandlers); CHExceptionHandlers是我们自定义的函数 可以实现自己定义的方法,比如crash的堆栈信息保存本地、上传到服务器或者进行其他的操作。
void CHExceptionHandlers(NSException *exception) {
NSLog(@"%s", __func__);
//exception 属性
////异常类型名称
//@property (readonly, copy) NSExceptionName name;
////异常原因
//@property (nullable, readonly, copy) NSString *reason;
////额外用户信息
//@property (nullable, readonly, copy) NSDictionary *userInfo;
////数据调用栈地址列表
//@property (readonly, copy) NSArray<NSNumber *> *callStackReturnAddresses;
////数据调用栈符号列表
//@property (readonly, copy) NSArray<NSString *> *callStackSymbols;
//crash堆栈信息
NSString *str = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject stringByAppendingString:@"/log.log"];
[exception.callStackSymbols writeToFile:str atomically:NO];
NSLog(@"%@",str);
}
这里就是做了一个对日志的本地保存的处理 添加了异常捕获函数后,发生crash就会在打印日志中看到crash日志保存路径
通过访达进入到该路径即可获取到crash日志
拿到了crash日志,我们就可以进行一个上传到服务器的这么一个操作,从而有效的处理BUG,完善我们的代码。