之前写了一篇博文《【Flutter】程序报错导致的灰屏总结》,浏览量、收藏率和点赞量还挺高,还被收录了,就想着总结一下iOS崩溃
,这个也是在iOS面试中经常被问到的。
在 iOS 开发过程中,导致 App 崩溃的原因多种多样,大致可以分为以下几大类,
还是很想说,代码规范很重要,代码格式化也能方便我们查找BUG!!!
访问野指针(野地址)
EXC_BAD_ACCESS
、SIGSEGV
内存泄漏造成系统回收进程(OOM)
JetsamEvent
中循环引用
block
中引用 self
、delegate
没有用 weak
,导致对象无法释放线程安全问题
死锁
后台线程更新 UI
数组越界
NSArray *array = @[];
NSLog(@"%@", array[1]); // 崩溃
向不可变字典中插入 nil
[@{@"key": nil} mutableCopy]; // 崩溃
非法类型转换
[someObject stringByAppendingString:@"test"]
,但 someObject 实际是 NSNullKVO 崩溃
KVC 崩溃
setValue:forKey:
时 key 错误约束冲突导致 UI 崩溃
Storyboard / XIB 使用错误
未处理的手势或交互崩溃
UIPanGestureRecognizer
时 target 指针已释放文件路径为空或错误
NSString *path = nil; [NSData dataWithContentsOfFile:path];
访问沙盒外非法路径
JSON 结构变化或数据缺失
NSJSONSerialization
时返回了 nulltry-catch
包裹潜在异常代码(如 NSException)dlsym 找不到符号
调用系统私有 API
App 被系统强制终止
权限未申请导致崩溃
delloc
,如果页面销毁没有打印,及时检查一下相关的逻辑,imageNamed:
会缓存,可以使用imageWithContentsOfFile:
;dispatch_async(dispatch_get_main_queue(), ^{ // UI操作 });
这个就很好解决了,网上有封装好的安全插入或者存储的库,都是使用runtime
写的。
FBKVOController
,iOS 11 起建议使用 NSKeyValueObservation
替代手动 add/remove;- (void)setValue:forUndefinedKey:
中打日志避免崩溃,对 model 层添加 @property
完整定义,不让非法 key 存在;fileExistsAtPath
@try @catch
,但是我不建议使用@try @catch
,这样会导致问题一直无法被暴露工具 | 功能 |
---|---|
Xcode Debugger | 崩溃堆栈分析、调试器跟踪 |
Crashlytics | 崩溃日志收集平台 |
Bugly / Sentry | 支持符号化和用户设备统计 |
Instruments | 内存泄漏、对象分配分析 |
Address Sanitizer | 运行时检测内存访问越界等问题 |