当前位置: 首页 > news >正文

【iOS】iOS崩溃总结

【iOS】iOS崩溃总结


一、前言

之前写了一篇博文《【Flutter】程序报错导致的灰屏总结》,浏览量、收藏率和点赞量还挺高,还被收录了,就想着总结一下iOS崩溃这个也是在iOS面试中经常被问到的

在 iOS 开发过程中,导致 App 崩溃的原因多种多样,大致可以分为以下几大类,
Alt
还是很想说,代码规范很重要,代码格式化也能方便我们查找BUG!!!


二、内存相关问题

  1. 访问野指针(野地址)

    • 访问已经被释放的对象(Use After Free)
    • 常见崩溃提示:EXC_BAD_ACCESSSIGSEGV
  2. 内存泄漏造成系统回收进程(OOM)

    • 未释放的内存持续增长,导致系统强制杀掉进程
    • 通常无法捕获崩溃日志,但系统会记录在 JetsamEvent
  3. 循环引用

    • block 中引用 selfdelegate 没有用 weak,导致对象无法释放

三、多线程问题

  1. 👉🏻 线程安全问题

    • 多线程读写同一数据结构,导致崩溃或数据错乱
  2. 👉🏻 死锁

    • dispatch_sync 嵌套调用自己,或等待永远不会结束的任务
  3. 👉🏻 后台线程更新 UI

    • UIKit 只能在主线程使用,在子线程操作 UI 会崩溃

四、数组、字典越界或非法数据

  1. 👉🏻 数组越界

    NSArray *array = @[];
    NSLog(@"%@", array[1]); // 崩溃
    
  2. 👉🏻 向不可变字典中插入 nil

    [@{@"key": nil} mutableCopy]; // 崩溃
    
  3. 👉🏻 非法类型转换

    • [someObject stringByAppendingString:@"test"],但 someObject 实际是 NSNull

五、KVO/KVC 相关

  1. 👉🏻 KVO 崩溃

    • 重复添加或移除观察者
    • 在对象释放前未移除观察者
    • 修改未定义 keyPath
  2. 👉🏻 KVC 崩溃

    • setValue:forKey: 时 key 错误
    • 对私有变量或不存在属性赋值

六、UI相关问题

  1. 👉🏻 约束冲突导致 UI 崩溃

    • AutoLayout 添加了冲突的 constraint
  2. 👉🏻 Storyboard / XIB 使用错误

    • IBOutlet 未连接或连接错误
    • 控件在 XIB 中已删除,但代码中仍引用
  3. 👉🏻 未处理的手势或交互崩溃

    • 比如使用 UIPanGestureRecognizer 时 target 指针已释放

七、文件和路径操作问题

  1. 👉🏻 文件路径为空或错误

    • 使用 NSString *path = nil; [NSData dataWithContentsOfFile:path];
  2. 👉🏻 访问沙盒外非法路径

    • iOS 不允许访问 App 沙盒外的文件路径

八、网络或 JSON 解析异常

  1. 👉🏻 JSON 结构变化或数据缺失

    • 使用 NSJSONSerialization 时返回了 null
    • 使用 Model 框架(如 YYModel、MJExtension)时解析 nil 或错误类型字段

九、未捕获的异常

  1. 👉🏻 未使用 try-catch 包裹潜在异常代码(如 NSException)
  2. 👉🏻 使用断言(NSAssert)在 Release 模式中崩溃

十、符号错误 / 动态库加载失败

  1. 👉🏻 dlsym 找不到符号

    • 使用动态库(如 C 语言、Go 编译为 static lib)时忘记导出符号或链接失败
  2. 👉🏻 调用系统私有 API

    • 在审核或某些系统中崩溃

十一、其他系统行为

  1. 👉🏻 App 被系统强制终止

    • 使用过多内存、后台违规行为等
    • iOS 低电量或资源紧张时杀掉后台 App
  2. 👉🏻 权限未申请导致崩溃

    • 相机、麦克风、定位等未正确配置权限描述

十二、总结&工具

👉🏻 总结

1. 内存相关问题
  • 针对于内存相关的崩溃,要养成良好的开发习惯,
    定期使用Instruments排查一下,还有就是内存泄露或者暴涨,可以在基类的销毁方法里面打印一下delloc,如果页面销毁没有打印,及时检查一下相关的逻辑,
  • 还有一些导致内存暴涨的,比如加载大图,如果使用imageNamed: 会缓存,可以使用imageWithContentsOfFile:;
  • 还有可以复用的场景,比如自定义的试图View;
2. 多线程问题
  • 关于线程不安全访问,可以用 dispatch_queue 同步访问共享资源,也可以用 @synchronized 或 NSLock 等锁机制,还可以封装线程安全类;
  • 对于死锁,避免 dispatch_sync 嵌套调用当前 queue,使用主线程 dispatch_async 更新 UI
  • 在子线程更新UI,可以使用 dispatch_async(dispatch_get_main_queue(), ^{ // UI操作 });
3. 集合类崩溃问题

这个就很好解决了,网上有封装好的安全插入或者存储的库,都是使用runtime写的。

4. KVO / KVC 崩溃
  • 可以封装 KVO,推荐使用 FBKVOController,iOS 11 起建议使用 NSKeyValueObservation 替代手动 add/remove;
  • - (void)setValue:forUndefinedKey: 中打日志避免崩溃,对 model 层添加 @property 完整定义,不让非法 key 存在;
5. UI 崩溃 & 防护
  • 针对于Storyboard/XIB 连接错误,每次修改 IBOutlet 后编译验证,控件删除时一并移除 IBOutlet;
  • AutoLayout 崩溃,设置约束时避免冲突(使用 >=、<= 等)
6. 文件/路径/JSON 解析
  • 针对于nil或者非法值,可以使用fileExistsAtPath
  • 如果是JSON 解析字段缺失或类型不匹配,可以使用 isKindOfClass 判断类型,还可以封装 Model 层容错代码(如缺字段时默认值)
7. 权限问题
  • 一个是添加plist权限字段
  • 还有就是在使用前,做一下权限的判断;
8. 其他高风险点
  • 可以使用断言
  • 使用@try @catch,但是我不建议使用@try @catch,这样会导致问题一直无法被暴露

👉🏻 工具

工具功能
Xcode Debugger崩溃堆栈分析、调试器跟踪
Crashlytics崩溃日志收集平台
Bugly / Sentry支持符号化和用户设备统计
Instruments内存泄漏、对象分配分析
Address Sanitizer运行时检测内存访问越界等问题

十三、关于作者(ZFJ_张福杰)

  • 官网:https://zfjsafe.com
  • 博客:https://zfj1128.blog.csdn.net
  • Github:https://github.com/zfjsyqk
  • Gitee:https://gitee.com/zfj1128
  • 打赏:https://zfjsafe.com/paycode

http://www.lqws.cn/news/514783.html

相关文章:

  • 一篇文章了解XML
  • 了解笔记本电脑制造:从品牌到代工厂的全产业链
  • Node.js-fs模块
  • linux内核中的链表实现
  • sentinel与seata组件在微服务中的基本作用
  • 微信点餐小程序—美食物
  • ICML 2025 | 低秩Swish网络:理论突破实现高效逼近,小模型性能媲美大网络
  • CSP - J 400分题单总结(洛谷题号)
  • 通过 HTML 子图和多尺度卷积 BERT 的双向融合实现可解释的恶意 URL 检测
  • xtrabackup 的工作原理 为什么不用停服?
  • Jenkins Pipeline 与 Python 脚本之间使用环境变量通信
  • IDEA高效开发指南:JRebel热部署
  • 设计模式精讲 Day 13:责任链模式(Chain of Responsibility Pattern)
  • 激光束修复手机屏任意层不良区域,实现液晶线路激光修复原理
  • 鸿蒙与h5的交互
  • AR美型SDK,重塑面部美学,开启智能美颜新纪元
  • 微信小程序适配 iPhone 底部导航区域(safe area)的完整指南
  • 【JAVA】idea中打成jar包后报错错误: 找不到或无法加载主类
  • 大学专业科普 | 物联网、自动化和人工智能
  • IO多路复用——Poll底层原理深度分析
  • 深入解析RS485通信:从原理到Linux驱动开发实践
  • DeepSeek在数据分析与科学计算中的革命性应用
  • “易问易视”——让数据分析像聊天一样简单
  • 终止分区表变更操作时误删数据字典缓存导致MySQL崩溃分析
  • 【网站内容安全检测】之2:从网站所有URL页面中提取所有外部及内部域名信息
  • 批量DWG转PDF工具
  • 提供一种在树莓派5上切换模式的思路(本文是面向显示屏配置文件)
  • LVS-DR负载均衡群集深度实践:高性能架构设计与排障指南
  • BUUCTF在线评测-练习场-WebCTF习题[ACTF2020 新生赛]BackupFile1-flag获取、解析
  • 一款实验室创客实验室用的桌面式五轴加工中心