【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.pswp.cn/news/911923.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习:特征向量与数据维数概念

特征向量与数据维数概念 一、特征向量与维数的定义 特征向量与特征类别 在机器学习和数据处理中&#xff0c;每个样本通常由多个特征&#xff08;Feature&#xff09; 描述。例如&#xff0c;一张图片的特征可能包括颜色、形状、纹理等&#xff1b;一个客户的特征可能包括年龄…

开发基于Jeston Orin Nx 开发版 16G的实现

一、基本配置 1.配置参数 密码&#xff1a;yahboom Ubuntu 20.04版本、python3.8、CUDA11.4、cuDNN8.6、TensorRT8.5、Jetpack5.1.1、Opencv4.5.4版本 终端输入命令&#xff1a;sudo jtop 其中Jetpack是英伟达提供的专门供它自己的嵌入式计算机平台使用的人工智能包。 终…

【技术分享】XR技术体系浅析:VR、AR与MR的区别、联系与应用实践

XR技术体系浅析&#xff1a;VR、AR与MR的区别、联系与应用实践 作者&#xff1a;EQ 雪梨蛋花汤 本文是技术分享文档&#xff0c;浅析VR&#xff08;虚拟现实&#xff09;、AR&#xff08;增强现实&#xff09;、MR&#xff08;混合现实&#xff09;的定义、特性、技术演进路线&…

R语言入门课| 05 一文掌握R语言常见数据类型

视频教程 大家可以先做一做R语言基础小测验&#xff0c;看看自己是否需要跟我们5.5h入门R语言的课程。 先上教程视频&#xff0c;B站同步播出&#xff1a; https://www.bilibili.com/video/BV1miNVeWEkw 完整视频回放和答疑服务可见&#xff1a;5.5h入门R语言 本节课程视频…

vRDMA 发布,助力云上 VPC 内高性能通信

资料来源&#xff1a;火山引擎-开发者社区 近日&#xff0c;火山引擎基于部分云服务器实例规格邀测发布 vRDMA 特性&#xff0c;提供云上 VPC 内大规模 RDMA 加速能力&#xff0c;可兼容传统 HPC 应用、AI 应用以及传统 TCP/IP 应用&#xff0c;降低大众化场景的适配门槛&#…

Win10安装dify

一、win10虚拟化设置&#xff0c;控制面板中开启如下三个服务 二、检查确认wls服务开启 设置自动启动并启动 确认服务开启 bcdedit 是否为auto&#xff0c;如果不是&#xff0c;设置为auto bcdedit /set hypervisorlaunchtype autocpu是否为虚拟化 更新wsl wsl --update二 …

【ai学习笔记】GitLab

CI/CD&#xff08;持续集成/持续交付&#xff09;是现代软件开发中的关键实践&#xff0c;通过自动化工具可以大幅提升开发效率和软件质量。下面为你介绍CI/CD的核心概念、常用工具以及示例配置&#xff1a; 1. CI/CD 核心概念 持续集成&#xff08;CI&#xff09;&#xff1…

Solidity 从 0 到 1 |Web3 开发入门免费共学营

开启你的 Web3 开发之旅&#xff0c;从 Sonic 开始&#xff01; 想进入区块链开发的世界&#xff0c;却不知道从哪里开始&#xff1f;选择对的语言和平台&#xff0c;才能事半功倍。 Solidity 是 Web3 中最主流、最通用的智能合约开发语言&#xff0c;被广泛应用于以太坊及其…

【unitrix】 4.4 类型级整数比较系统(cmp.rs)

一、源码 这段代码实现了一个类型级别的整数比较系统&#xff0c;允许在编译时进行整数比较操作。它定义了一套类型来表示比较结果&#xff0c;并为不同类型的整数实现了比较逻辑。 use core::cmp::Ordering; use core::default::Default; use crate::sealed::Sealed; use cr…

2025年渗透测试面试题总结-2025年HW(护网面试) 14(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. SQL注入原理 &#x1f4a5; 2. XXE攻击&#xff08;XML外部实体注入&#xff09; &#x1f9e9; 3. SQ…

Android开发根据滑动距离标题栏进行渐变

Android开发根据滑动距离标题栏进行渐变 假设滑动控件是NestedScrollView。 先监听NestedScrollView的滑动距离&#xff1a; nslv_preview_me.setOnScrollChangeListener(object :NestedScrollView.OnScrollChangeListener{override fun onScrollChange(v: NestedScrollView…

高中成绩可视化平台开发笔记

高中成绩可视化平台&#xff08;1&#xff09; 一、项目概述 本系统是一个基于 PyQt5 和 Matplotlib 的高中成绩数据可视化分析平台&#xff0c;旨在帮助教师快速了解学生成绩分布、班级对比、学科表现等关键指标。平台支持文科与理科的数据切换&#xff0c;并提供多个维度的图…

自动化按需导入组件库的工具rust版本完成开源了

背景 当我为每个Vue项目使用ui组件库的时候&#xff0c;都会使用按需导入的方式来使用ui组件库。但是每次按需导入&#xff0c;不可避免的就需要做以下三步。我们以element plus ui组件库为例。 1. 安装依赖 第一步&#xff0c;当然是需要安装依赖。命令如下: pnpm add unp…

Linux内核中TCP分段的核心机制:tcp_fragment函数解析

引言:TCP分段的必要性 在TCP/IP协议栈中,MSS(最大分段大小) 限制了单次传输的数据量。当应用层发送的数据超过当前路径的MSS时,内核必须执行分段操作。tcp_fragment函数正是Linux内核中处理TCP分段的核心机制,它巧妙地在协议合规性、内存安全和性能效率之间取得平衡。 一…

【赵渝强老师】OceanBase OBServer节点的SQL层

OceanBase OBServer节点的SQL层将用户的SQL请求转化成对一个或多个Tablet的数据访问。SQL层会按照以下顺序经过一系列组件来处理一个SQL&#xff1a; Parser -->Resolver-->Transformer-->Optimizer-->CodeGenerator-->Executor。视频讲解如下 【赵渝强老师】O…

从“高配”到“普惠”,黑芝麻智能携手Nullmax打造辅助驾驶主流量产方案

近日&#xff0c;黑芝麻智能携手Nullmax打造的辅助驾驶主流量产方案正式发布。该方案面向8-15万元级别主流车型&#xff0c;基于单颗黑芝麻智能武当C1236跨域计算芯片&#xff0c;集成Nullmax全栈自研的软件技术架构&#xff0c;结合领先的视觉感知算法&#xff0c;打造高性能辅…

信息安全认证体系全解析:从资质证明到行业准入的实践指南

Hello&#xff01;大家好&#xff0c;小编是一名专注IT领域的资深探索家&#xff0c;大家发现了吗&#xff1f;现在刷招聘软件&#xff0c;国企安全岗必标 "CISP 优先"&#xff0c;外企招聘悄悄写着 "CISSP 加分"—— 这些带字母的证书到底是啥&#xff1f…

优雅地创建实体类——Builder 链式调用

我们来看以下的代码。改造前构造实体类用重载构造器或用 setter 对变量进行赋值&#xff0c;一旦变量变多则需要对每个变量进行 set 赋值&#xff0c;并且有可能会赋值错对象。 private static void test() {//1.构造器赋值Task task1 new Task("2023000000009439"…

如何轻松将照片从 iPhone 传输到 Android?

从 iPhone 换到 Android 手机后&#xff0c;你肯定不想丢掉珍贵的照片回忆吧&#xff1f;好在&#xff0c;本文分享了 6 种有效的解决方案&#xff0c;教你如何轻松地将照片从 iPhone 传输到 Android。 第 1 部分&#xff1a;如何通过 iReaShare Phone Transfer 将照片从 iPhon…

AI编程:[体验]存量微服务架构下植入WebSocket的“踩坑”与“填坑”

一、核心需求 功能需求&#xff1a;用户可以通过语音与AI对话&#xff0c;并实现类似ChatGPT的实时交互&#xff08;流式响应&#xff0c;打字机效果&#xff09;技术需求&#xff1a;在现有微服务架构中进行扩展&#xff08;SpringCloud&#xff09; 二、技术盲点 陌生领域 …