1、crash分析

闪退

crash,即闪退,指app在使用过程中出现异常错误,导致app被系统杀死,退出App。

crash的出现场景

  • unrecognized selector(找不到对象方法或者类方法的实现)
    • 通常是因为一个对象调用了一个不属于它方法的方法导致
  • KVO Crash
    • KVO 添加次数和移除次数不匹配:
      • 移除未注册的观察者,导致崩溃
      • 重复移除多次,移除次数多于添加次数,导致崩溃
      • 重复添加多次,虽然不会崩溃,但是发生改变时,也同时会被观察多次。
    • 被观察者提前被释放,被观察者在 dealloc 时仍然注册着 KVO,导致崩溃。 例如:被观察者是局部变量的情况(iOS 10 及之前会崩溃)。
    • 添加了观察者,但未实现 observeValueForKeyPath:ofObject:change:context: 方法,导致崩溃。
    • 添加或者移除时 keypath == nil,导致崩溃。
  • 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

2、技术实现

3、性能分析&案例使用