**

前言

**
移动APP中关于crash几乎是0容忍的,那么iOS中会有很多引起crash,比如最常见的数组越界,添加空值。

如果你想解决大部分可能引起的crash,保持代码的健壮性,又不想修改太多代码,那么推荐你使用WOCrashProtector

一款提高iOS稳定性,有效防止闪退的框架

WOCrashProtector

GitHub地址

Release: 不会crash Debug: 为了更好的追踪问题,依旧会crash,但提供了更多的crash信息

常见carsh汇总
接下来介绍一下,哪些方法使用不慎会引起crash,当然就像上面说的,引入YCBStability会让你的代码更健壮,我在runtime中,进行了方法拦截,避免了carsh

因此,你只要导入YCBStability,不需要添加任何代码,你的代码将变得足够强壮

原理介绍
前面写了很多关于YCBStability解决crash问题,如果你只是想解决代码中的问题,读到这里就够了。

但如果你想了解更多知识,下面我来对crash进行汇总,希望能帮助到你。

OC方法中的那些坑
OB提供的方法并不是健壮的,最常见的,set一个nil or数组越界都会引起crash,有很多朋友喜欢加一些判断,我认为这是一个良好的意识,但并不是最好的做法。

考虑到代码的简洁性,我建议你删掉这些if-else,引入YCBStability

但如果你已经用了Category来避免这些方法引起的crash,那么我建议你继续Category

NSArray
方法 crash说明 :

  • (ObjectType)objectAtIndex:(NSUInteger)index 当index大于数组count的时候引起数组越界
  • (NSUInteger)indexOfObject:(ObjectType)anObject 当anObject为nil时carsh
    NSMutableArray
    方法 crash说明
  • (void)addObject:(ObjectType)anObject 当anObject为nil时carsh
  • (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index 当anObject为nil时carsh,当index>mutArray.count时,会产生越界
  • (void)removeObjectAtIndex:(NSUInteger)index 当index>mutArray.count时,会产生越界
    NSMutableSet
    方法 crash说明
  • (void)addObject:(ObjectType)object 当anObject为nil时carsh
    NSMutableDictionary
    方法 crash说明
  • (void)setObject:(ObjectType)anObject forKey:(KeyType)aKey 当anObject为nil时,或key为nil时,都会引起crash
    泛型的坑
    在NSDictionary中,我们经常用到这个方法
- (nullable ObjectType)objectForKey:(KeyType)aKey;

这种返回值类型很容易产生坑,举个列子:

项目API文档服务器返回数据如下

 {list :('a','b')
}

这时候,你通过

NSArray *array = [dic objectForKey:@"list"];
NSString *str = [array firstObject];

正常状态下,不会有任何问题,但是你要知道,服务器的数据是不可信的,有一天服务器代码出现了bug,list不再是数组,那么APP就会Crash

{list: {}}

因为此时的[dic objectForKey:@"list"];取出返回了Dic, 而你依然认为是NSArray,并且调用了firstObject方法,Dic里没有firstObject,APP会crash

面对服务器返回数据的信任问题,有些同学养成了好习惯,加入了if-else,但是我希望你引入YCBStability,使用如下方法:


@interface NSDictionary (YCBStability)/** 取key对应的字符串 */
- (NSString *)getStringForKey:(id)key;/** 取key对应的数组 */
- (NSArray *)getArrayForKey:(id)key;/** 取key对应的字典 */
- (NSDictionary *)getDictinaryForKey:(id)key;- (int)getIntForKey:(id)key;- (float)getFloatForKey:(id)key;- (BOOL)getBoolForKey:(id)key;@end

根据你要的类型选择不同的方法,

debug模式:如果和预期类型不符会crash,方便问题追踪 release模式:我做了容错处理,避免了crash

非空判断
为了更好的支持类型判断,我提供了如下方法供使用

@interface YCBNonEmpty : NSObject/** 判断是否是非空的数组 */
+ (BOOL)isArray:(id)object;/** 判断是否是非空的集合*/
+ (BOOL)isSet:(id)object;/** 判断是否是非空的字符串 */
+ (BOOL)isString:(id)text;/** 判断是否是非空的字典 */
+ (BOOL)isDictionary:(id)object;@end

非空判断是代码中经常用到的技巧,以保证代码的健壮性,在YCBNonEmpty中,我依据类型和count两个条件,判断非空,更加安全准确。

原文:https://www.jianshu.com/p/5477c0d57bcb

iOS开发中,如何防止Crash(闪退,崩溃)?相关推荐

  1. IOS开发-如何debug及处理闪退

    我只写些相对来说,比较有用的信息,想完整阅读的,可以自行去原文.. 原文来自:http://www.raywenderlich.com/10209/my-app-crashed-now-what-pa ...

  2. 开发中遇到的Redis闪退的原因

    Redis点击redis-server.exe启动,结果闪退,这种情况有可能的一种原因就是你已经启动了一个Redis服务,因为端口被占用,导致第二个无法启动.

  3. endnote x9 word 中插入参考文献时闪退崩溃

    写论文,用endnote插入参考文献时,word崩溃闪退. 官方回应 导致问题的原因:有像域代码之类的交互,与endnote冲突. 解决方法:把word文档clean下,即将域代码删除. 操作步骤 1 ...

  4. 最常见的闪退崩溃(Android、ios) 原因

    设备碎片化:由于设备极具多样性,APP在不同的设备上可能有表现不同: 带宽限制:带宽不佳的网络对APP所需的快速响应时间可能不够: 网络的变化:不同网络间的切换可能会影响APP的稳定性: 内存管理:可 ...

  5. iOS开发中各种关键字的区别

    1.一些概念 1.浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存. 深Copy:内存的复制,两块内存是完全不同的, 也就是两个对象指针分别指向不同的内存,互不干涉. 2.atom ...

  6. iOS开发中屏幕旋转(二)

    Morris_ 2019.04.11 前面有总结过一些在开发中遇到的屏幕旋转的基础知识. 一.设置应用支持的转屏方向 设置方式 00x1 在TARGET->General->Deploym ...

  7. iOS开发中的Web应用概述

    为了更好的阅读体验,建议阅读原文 插播广告 -- 几十行代码完成资讯类App多种形式内容页 HybridPageKit :一个针对资讯类App高性能.易扩展.组件化的通用内容页实现框架. 想和我一起全 ...

  8. [转] iOS --- 自释放在iOS开发中的应用

    转载自庞海礁的个人空间. 今天,跟大家聊聊"自释放"思想在iOS开发中的应用,何为"自释放"?可以简单的理解为对象在生命周期结束后自动清理回收所有与其相关的资源 ...

  9. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  10. iOS 开发中的多线程

    线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...

最新文章

  1. 欢迎使用markdown编辑器20181206
  2. 什么样的python程序员好找工作-Python学到什么程度才可以去找工作?掌握这4点足够了!...
  3. python刷取CSDN博文访问量之一
  4. CTF-Python打包成的exe文件Re逆向
  5. trap--shell脚本调试的不二人选
  6. linux ora 01092,ORA-01173的模拟与故障处理
  7. type-c接口图片_TypeC接口除了充电还能干吗?这些功能都不知道,简直是在浪费...
  8. oracle创建、删除索引等操作
  9. block的界面间传值的使用
  10. objectC时间用法
  11. fiddler抓包时,出现的 Tunnel to ***** : 443
  12. iOS开发:几种静态扫描工具的使用与对比
  13. jmeter之使用代理录制脚本
  14. 找轮转后的有序数组中第K小的数
  15. 乐优商城服务器部署_黑马乐优商城项目总结
  16. linux md5sum 文件夹,linux md5sum 的用法
  17. 邮箱 手机号 格式要求
  18. 统计检验P值代表什么及统计显著性检验方法原理
  19. 阿里云Aliplayer视频播放2(断点续播--根据上次播放记录实现续播功能)
  20. 浙江八年级 python_今年9月起 浙江八年级新增Python编程课程

热门文章

  1. 软件从业人员在代码之外如何提升自己的软技能
  2. Linux服务介绍一,关闭你不需要的服务
  3. qml 中的function怎么加类型_皮炎有哪些类型?生活中皮炎要怎么预防?得了皮炎要注意哪些问题...
  4. 贝叶斯网络应用实例一:胸部疾病诊所
  5. IOS学习之路二十四(custom 漂亮的UIColor)
  6. [推荐系统]个性化推荐的十大挑战
  7. CobaltStrike上线Linux主机(CrossC2)
  8. 中国汽水制造商市场趋势报告、技术动态创新及市场预测
  9. 双核处理器的双核是什么意思?
  10. 小程序数据为何传不到服务器上,小程序真机调试,发送不到数据到后台