iOS App Crash 防护框架之 MKCrashGuard

MKCrashGuard是一款针对iOS应用的崩溃防护框架,它能自动修复并捕获运行时的Crash。通过Objective-C的动态特性和AOP编程,实现无侵入式的Crash防护,包括处理unrecognized selector、KVO、KVC、NSTimer、NSNotification等问题。同时,框架避免了对特定对象的hook操作,如AMap、RACKVOProxy,并提供线程回溯功能,帮助理解Crash原因。
摘要由CSDN通过智能技术生成

github 传送门

MKCrashGuard

App 运行时 Crash 自动修复 + 捕获上传

1、使用

  • 添加组件
pod 'MKAppKit/MKCrashGuard'
  • 使用
// 启用防护
[MKCrashGuardManager executeAppGuard];
// 设置 crash 回调
[MKCrashGuardManager registerCrashHandle:self];

2、守护的情形

  • unrecognized selector sent to instance
  • KVO 添加观察者后没有清除、重复添加 (移除) 观察者 (keyPath) 导致的 Crash
  • KVC
  • NStimer 与 Target 强引用,内存泄漏
  • NSNotification iOS9 之前添加通知后,没有移除会导致 Crash
  • NSString,NSArray,NSDictonary,NSAttributedString,NSSet 以及对应的可变形式
  • Zombie Pointer 暂未支持
  • UINavigationController 重复跳转的问题

3、设计原理

  • 利用 Objective-C 语言的动态特性, 采用 AOP面向切面编程的设计思想, 做到无痕植入。对业务代码的零侵入性地将原本会导致 app 崩溃的 crash 抓取住, 消灭掉, 保证 app 继续正常地运行, 再将 crash 的具体信息提取出来, 实时返回给用户。

  • 为了避免冲突,一些 hook 操作前会判断对象的类型,比如 KVO 会判断 NSStringFromClass(object_getClass(object) 如果包含 AMap、RACKVOProxy,就取消 hook 操作。

  • 可变的都继承自不可变的, 所有可变的分类中, 重复的方法就不用替换了。

3.1 监听实例 dealloc

销毁的步骤

> 销毁实例对象时,会调用 dealloc 方法,从子类往父类,依次调用各个的 dealloc,直到 NSObject.
> NSObject 的 dealloc 会调用 object_dispose() 函数,然后释放内存。
> object_dispose 会
    * 析构 C++ 的实例变量
    * 移除 objc_setAssociatedObject 方法关联的对象
    * ARC 下调用实例变量们 (iVars) 的 release 方法,移除 weak 引用

objc_setAssociatedObject 策略:

OBJC_ASSOCIATION_ASSIGN	没有内存管理; 简单地赋值。 == assign
OBJC_ASSOCIATION_RETAIN_NONATOMIC	非原子地保留对象。 ==  nonatomic retain
OBJC_ASSOCIATION_COPY_NONATOMIC	以非原子方式复制对象。 ==  nonatomic copy
OBJC_ASSOCIATION_RETAIN	原子地保留对象。  ==    retain
OBJC_ASSOCIATION_COPY	以原子方式复制对象。 ==    copy

AssociatedObject 原理:
关联对象的实现不复杂,保存的方式为一个全局的哈希表,存取都通过查询表找到关联来执行。哈希表的特点就是牺牲空间换取时间,所以执行速度也可以保证。
  • 由于 dealloc 方法最后会移除 Associated Object,所以当一个对象(Host)释放后,其关联的对象(Associated Object)也会被释放。
  • objc_setAssociatedObject(被添加对象,key,value,AssociationPolicy / 策略)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值