iOS开发 Crash防卫

1.在iOS中可能出现Crash的情况

  • unrecognized selector sent to instance(找不到对象方法的实现)
  • unrecognized selector sent to class(找不到类方法实现)
  • KVO Crash
  • KVC Crash
  • NSNotification Crash
  • NSTimer Crash
  • Container Crash(集合类操作造成的崩溃,例如数组越界,插入 nil 等)
  • NSString Crash (字符串类操作造成的崩溃)
  • Bad Access Crash (野指针)
  • Threading Crash (非主线程刷 UI)
  • NSNull Crash

2.常见Crash

Objective-C 语言是一门动态语言,我们可以利用 Objective-C 语言的 Runtime 运行时机制,对需要Hook的类添加 Category(分类),在各个分类的 +(void)load; 中通过 Method Swizzling拦截容易造成崩溃的系统方法,将系统原有方法与添加的防护方法的 selector(方法选择器)IMP(函数实现指针)进行对调。然后在替换方法中添加防护操作,从而达到避免以及修复崩溃的目的。

3.KVO Crash

KVO 添加次数和移除次数不匹配:
移除了未注册的观察者,导致崩溃。
重复移除多次,移除次数多于添加次数,导致崩溃。
重复添加多次,虽然不会崩溃,但是发生改变时,也同时会被观察多次。
被观察者提前被释放,被观察者在 dealloc 时仍然注册着 KVO,导致崩溃。
例如:被观察者是局部变量的情况(iOS 10 及之前会崩溃)。
添加了观察者,但未实现 observeValueForKeyPath:ofObject:change:context: 方法,导致崩溃。
添加或者移除时 keypath == nil,导致崩溃。

文章参考:https://www.jianshu.com/p/e3713d309283

4.KVC Crash

KVC 日常使用造成崩溃的原因通常有以下几个:

key 不是对象的属性,造成崩溃。
keyPath 不正确,造成崩溃。
key 为 nil,造成崩溃。
value 为 nil,为非对象设值,造成崩溃。

你可能感兴趣的:(iOS开发 Crash防卫)