IOS 防止崩溃 Crash 组件
来源:互联网 发布:广西广电网络公司地址 编辑:程序博客网 时间:2024/05/17 23:30
直接上干货 IOS 防止Crash 组件
导致crash 原因,网上一大堆,不废话介绍。此处省略一万字
当前为何的项目 排行高的Crash项
- UIKit Called on Non-Main Thread
- KVO
- 容器越界(NSArray, NSDictionary,…)
- unrecognized selector crash (这个很多时候是由于class使用错误导致)
针对以上crash, 进行防止崩溃处理。以下一项项说。
UIKit Called on Non-Main Thread
替换UIView 的 setNeedsLayout, layoutIfNeeded,layoutSubviews, setNeedsUpdateConstraints。方法,判断当前线程是否为主线程,如果不是,在主线程执行。
- (void)wt_safe_setNeedsLayout{ if(![NSThread isMainThread]){ dispatch_async(dispatch_get_main_queue(), ^{ NSAssert(false, @"wt_safe_setNeedsLayout failed"); [self wt_safe_setNeedsLayout]; }); }else{ [self wt_safe_setNeedsLayout]; }}- (void)wt_safe_layoutIfNeeded{ if(![NSThread isMainThread]){ dispatch_async(dispatch_get_main_queue(), ^{ NSAssert(false, @"wt_safe_layoutIfNeeded failed"); [self wt_safe_layoutIfNeeded]; }); }else{ [self wt_safe_layoutIfNeeded]; }}- (void)wt_safe_layoutSubviews{ if(![NSThread isMainThread]){ dispatch_async(dispatch_get_main_queue(), ^{ NSAssert(false, @"wt_safe_layoutSubviews failed"); [self wt_safe_layoutSubviews]; }); }else{ [self wt_safe_layoutSubviews]; }}- (void)wt_safe_setNeedsUpdateConstraints{ if(![NSThread isMainThread]){ dispatch_async(dispatch_get_main_queue(), ^{ NSAssert(false, @"wt_safe_setNeedsUpdateConstraints failed"); [self wt_safe_setNeedsUpdateConstraints]; }); }else{ [self wt_safe_setNeedsUpdateConstraints]; }}
KVO Crash
项目中KVO crash 占比很高, 主要原因为,添加删除不对称导致。
解决方法为,添加Map进行缓存。具体大家看代码,有问题留言。
容器越界
这个问题,就是运用方法替换进行,目前对以下类进行防范,类中可能导致crash 的方法,逐步进行增量扩充。
- NSArray
- NSMutableArray
- NSAttributedString
- NSDictionary
- NSFileManager
- NSIndexPath
- NSJSONSerialization
- NSMutableAttributedString
- NSMutableDictionary
- NSMutableSet
- NSMutableString
- NSSet
- NSString
- NSURL
unrecognized selector crash
这个就比较简单了,直接上代码:
[NSObject jr_swizzleMethod:@selector(forwardingTargetForSelector:) withMethod:@selector(WT_safeForwardingTargetForSelector:) error:&error]; - (id)WT_safeForwardingTargetForSelector:(SEL)aSelector{ NSMethodSignature *signature = [self methodSignatureForSelector:aSelector]; if ([self respondsToSelector:aSelector] || signature) { return [self WT_safeForwardingTargetForSelector:aSelector]; } return [WTSafeGuard createFakeForwardTargetObject:self selector:aSelector];}
阅读全文
0 0
- IOS 防止崩溃 Crash 组件
- iOS Crash崩溃 排名
- iOS 崩溃Crash解析
- ios 异常 防止崩溃
- iOS Crash 崩溃日志总结
- iOS崩溃crash大解析
- iOS崩溃crash大解析
- iOS崩溃crash大解析
- iOS崩溃crash大解析
- iOS崩溃crash大解析
- iOS崩溃crash大解析
- iOS Crash(崩溃)调试技巧
- iOS crash 崩溃问题的追踪方法
- iOS 崩溃日志 Crash Log 分析汇总
- 解析IOS崩溃日志(crash Log)
- iOS crash 崩溃问题的追踪方法
- 解析IOS崩溃日志(crash Log)
- iOS- 全方位解析.crash文件崩溃报告
- BZOJ 1007: [HNOI2008]水平可见直线 题解
- 大菲波数 【java 高精度处理】
- codeforces 400B Inna and New Matrix of Candies (英语水平题)
- PB 数据窗口对象
- springcloud(第三篇)springcloud eureka 服务注册与发现
- IOS 防止崩溃 Crash 组件
- Java_基础—List的三个子类的特点
- HQL常用语句
- 执行mapreduce任务,出现running beyond virtual memory错误
- JAVA 8 Map的使用
- Android通过广播接收短信
- C语言printf(""),浮点数打印保留有效位数,小数部分的四舍五入
- java实现四种常用排序算法
- ZOJ1025-Wooden Sticks(dp)