1、crash分析
闪退
crash,即闪退,指app在使用过程中出现异常错误,导致app被系统杀死,退出App。
crash的出现场景
- unrecognized selector(找不到对象方法或者类方法的实现)
- 通常是因为一个对象调用了一个不属于它方法的方法导致
- KVO Crash
- KVO 添加次数和移除次数不匹配:
- 移除未注册的观察者,导致崩溃
- 重复移除多次,移除次数多于添加次数,导致崩溃
- 重复添加多次,虽然不会崩溃,但是发生改变时,也同时会被观察多次。
- 被观察者提前被释放,被观察者在 dealloc 时仍然注册着 KVO,导致崩溃。 例如:被观察者是局部变量的情况(iOS 10 及之前会崩溃)。
- 添加了观察者,但未实现 observeValueForKeyPath:ofObject:change:context: 方法,导致崩溃。
- 添加或者移除时 keypath == nil,导致崩溃。
- KVO 添加次数和移除次数不匹配:
- KVC Crash
- key 不是对象的属性,造成崩溃。
- keyPath 不正确,造成崩溃。
- key 为 nil,造成崩溃。
- value 为 nil,为非对象设值,造成崩溃。
- NSNotification Crash
- 当一个对象添加了notification之后,如果dealloc的时候,仍然持有notification,就会出现NSNotification类型的crash
- NSTimer Crash
- 注册了没有主动释放会内存泄露
- 在定时任务触发时可能会导致crash)
- Container / NSString Crash
- 集合类操作造成的崩溃,例如数组越界,插入 nil 等
- Threading Crash
- 非主线程刷新UI