在开发过程当中遇到比较多的crash仍是来自数据安全判读没有作好,同时苹果也没有给咱们兜底,致使了许多线上崩溃,如数组越界、数组插入nil等 。AvoidCrash库能够帮咱们很好的解决这个问题,同时这个库咱们在项目中也稳定跑了好久,效果很不错。接下来就简单介绍下AvoidCrash。
AvoidCrash用法
- pod 'AvoidCrash'
- 在AppDelegate的didFinishLaunchingWithOptions方法中调用becomeEffective方法
- 非全局生效,能够单个调用好比只须要数组的防御 [NSArray avoidCrashExchangeMethod];
AvoidCrash的防御涉及范围
如图主要是数组、字典、字符串、NSObject(KVC、unrecognized selector sent to instance)。能够看到AvoidCrash在初始化时有如下操做:

AvoidCrash的防御原理
一、经过category给类添加方法用来替换掉本来存在潜在崩溃的方法。
二、利用runtime方法交换技术,将系统方法替换成咱们给类添加的新方法。
三、利用异常的捕获来防止程序的崩溃,而且进行相应的处理。
好比防御 [NSArray objectAtIndex:]具体下代码


具体交换的代码以下
其余
对于NSObject(KVC、unrecognized selector sent to instance)的防御原理则是经过hook setValue:forKey: 以及消息转发中的methodSignatureForSelector:、forwardInvocation:来实现的 你们能够具体深刻源码瞅瞅git
其github地址