iOS开发 Crash防卫

作者: 喜剧收尾_XWX | 来源:发表于2020-12-22 18:05 被阅读0次

    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防卫

        本文链接:https://www.haomeiwen.com/subject/ivvsnktx.html