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,导致崩溃。
4.KVC Crash
KVC 日常使用造成崩溃的原因通常有以下几个:
key 不是对象的属性,造成崩溃。
keyPath 不正确,造成崩溃。
key 为 nil,造成崩溃。
value 为 nil,为非对象设值,造成崩溃。
网友评论