AvoidCrash原理简单分析

在开发过程当中遇到比较多的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的防御原理

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



具体交换的代码以下

其余

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

其github地址

相关文章
相关标签/搜索