跳过正文

iOS的Crash情况以及防护

·2 分钟
目录

前言
#

Crash 防护 分为两个方面 开始阶段拒绝出现,要不就是预测所有的情况进行处理。

  • 第一个是网络返回的数据类型校验,可以使用第三方工具在字典转模型的时候统一校验,防止崩溃,

  • 第二个方面是在 code 里面的引起的崩溃。

    源头上其实需要代码生产者编码的时候注意下,假设出现触发的情况如何处理。

    code 中的 crash
    #

    一共有6种情况,分别如下

  • 1.unrecognized selector crash 为 NSObject 添加扩展,swizzle 消息转发的第二个方法,将消息转发给中间类,这个中间类 动态添加方法,并调用。同时返回 NSNull 。参考

  • 2.KVO/KVC crash kvo 可以使用基类中添加数组(管理观察者)使用 kvo 的时候将观察者放入数组中,dealoc 使用清空观察者。 kvc swizzle 所有的可能被调用的 set 与 get 方法,然后使用 Try catch 方式守护。

    • 3.NSNotification crash
  • 4.NSTimer crash 使用中间类引用 NSTimer,便可以解决。

  • 5.Container crash(数组越界,插 nil 等) 对 常用的集合方法进行 swizzle,重写的方法要使用一些判断即可。

  • 6.NSString crash (字符串操作的 crash) 与集合操作类似

  • 7.Bad Access crash (野指针) 这个目前看没有最好的方法,即使加上防护也可能出现野指针的现象

  • 8.UI not on Main Thread Crash (非主线程刷 UI(机制待改善)) 刷新地方使用线程判断以及硬切换。即可避免。(可参考 SDwebImge 中的使用)

总结
#

防护的中心思想第一在事件发生的时候进行杜绝。尽量使用保护策略,不行的话只能崩溃发现时候利用奔溃出现的 进行定位,在源头发生的地方进行解决。

参考
#