Contents
  1. 1. iOS-常见崩溃分析
    1. 1.1. 1: 字典插入nil
    2. 1.2. 2: 越界
    3. 1.3. 3. unrecognized selector
    4. 1.4. 4. TableView & CollectionView cell代理方法存在返回 nil 的情况
    5. 1.5. 5. EXC_BAD_ACCESS
    6. 1.6. 6. SIGPIPE 异常
    7. 1.7. 7. 子线程UI操作崩溃
    8. 1.8. 8. SIGABRT 异常
    9. 1.9. 9. dispatch_group崩溃
    10. 1.10. 10. 对象释放的线程要和它处理事情的线程一致
    11. 1.11. 参考

iOS-常见崩溃分析

1: 字典插入nil

  • 通过Runtime替换,为系统方法添加容错
    • 同时添加日志,上报记录错误
    • 保证程序运行稳定的情况下,暴露错误

2: 越界

  • 处理方式同上

3. unrecognized selector

  • 可以再消息传递流程内进行防护

4. TableView & CollectionView cell代理方法存在返回 nil 的情况

  • 别偷懒

5. EXC_BAD_ACCESS

  • 开启僵尸对象调试选项进行调试

6. SIGPIPE 异常

经实验在多个ios版本下都不再触发SIGPIPE,完美解决问题。

  • 对一个端已经关闭的socket调用两次write,第二次write将会产生SIGPIPE信号,该信号默认结束进程

在pch中:

1
2
3
4
5
6
// 仅在 IOS 系统上支持 SO_NOSIGPIPE
#if defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)
// We do not want SIGPIPE if writing to socket.
const int value = 1;
setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(int));
#endif

7. 子线程UI操作崩溃

  • 放主线程

8. SIGABRT 异常

这是一个让程序终止的标识,会在断言、app内部、操作系统用终止方法抛出。通常发生在异步执行系统方法的时候。如CoreData、NSUserDefaults等,还有一些其他的系统多线程操作。
这并不一定意味着是系统代码存在bug,代码仅仅是成了无效状态,或者异常状态。

9. dispatch_group崩溃

  • enter 数量和 leave 数量要匹配

10. 对象释放的线程要和它处理事情的线程一致

参考

https://www.jianshu.com/p/c7efbc283480
https://www.jianshu.com/p/c4bd2960b3fa

Contents
  1. 1. iOS-常见崩溃分析
    1. 1.1. 1: 字典插入nil
    2. 1.2. 2: 越界
    3. 1.3. 3. unrecognized selector
    4. 1.4. 4. TableView & CollectionView cell代理方法存在返回 nil 的情况
    5. 1.5. 5. EXC_BAD_ACCESS
    6. 1.6. 6. SIGPIPE 异常
    7. 1.7. 7. 子线程UI操作崩溃
    8. 1.8. 8. SIGABRT 异常
    9. 1.9. 9. dispatch_group崩溃
    10. 1.10. 10. 对象释放的线程要和它处理事情的线程一致
    11. 1.11. 参考