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地址

相關文章
相關標籤/搜索