在开发过程中遇到比较多的crash还是来自数据安全判读没有做好,同时苹果也没有给我们兜底,导致了许多线上崩溃,如数组越界、数组插入nil等 。AvoidCrash库可以帮我们很好的解决这个问题,同时这个库我们在项目中也稳定跑了很久,效果很不错。接下来就简单介绍下AvoidCrash。
AvoidCrash用法
- pod 'AvoidCrash'
- 在AppDelegate的didFinishLaunchingWithOptions方法中调用becomeEffective方法
- 非全局生效,可以单个调用比如只需要数组的防护 [NSArray avoidCrashExchangeMethod];
AvoidCrash的防护涉及范围
如图主要是数组、字典、字符串、NSObject(KVC、unrecognized selector sent to instance)。可以看到AvoidCrash在初始化时有以下操作:
AvoidCrash的防护原理
1、通过category给类添加方法用来替换掉原本存在潜在崩溃的方法。
2、利用runtime方法交换技术,将系统方法替换成我们给类添加的新方法。
3、利用异常的捕获来防止程序的崩溃,并且进行相应的处理。
比如防护 [NSArray objectAtIndex:]具体下代码
具体交换的代码如下
其他
对于NSObject(KVC、unrecognized selector sent to instance)的防护原理则是通过hook setValue:forKey: 以及消息转发中的methodSignatureForSelector:、forwardInvocation:来实现的 大家可以具体深入源码瞅瞅