AvoidCrash原理简单分析

2,776 阅读1分钟
在开发过程中遇到比较多的crash还是来自数据安全判读没有做好,同时苹果也没有给我们兜底,导致了许多线上崩溃,如数组越界、数组插入nil等 。AvoidCrash库可以帮我们很好的解决这个问题,同时这个库我们在项目中也稳定跑了很久,效果很不错。接下来就简单介绍下AvoidCrash。

AvoidCrash用法

  1. pod 'AvoidCrash'
  1. 在AppDelegate的didFinishLaunchingWithOptions方法中调用becomeEffective方法
  1. 非全局生效,可以单个调用比如只需要数组的防护 [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:来实现的 大家可以具体深入源码瞅瞅

其github地址