美文网首页
异常捕获,避免程序crash

异常捕获,避免程序crash

作者: LPL_d5fc | 来源:发表于2020-05-10 21:46 被阅读0次

在某大佬那里扒来的大概步骤,懒得写了,后面会自己进行代码分析。

利用 分类(category) + runtime + 异常的捕获 来防止Foundation一些常用方法使用不当而导致的崩溃。其原理就是利用category、runtime来交换两个方法,并且在方法中捕获异常进行相应的处理。

1、通过category给类添加方法用来替换掉原本存在潜在崩溃的方法。

2、利用runtime方法交换技术,将系统方法替换成我们给类添加的新方法。

3、利用异常的捕获来防止程序的崩溃,并且进行相应的处理

链接:https://www.jianshu.com/p/8e816b4dbdb6

来源:简书

下面自己进行代码测试分析,上代码

情景一:向mutableArray添加空值,避免crash。并能打印异常

1.首先为NSMutableArray创建分类,添加方法用于替换可能出错的方法。

2.在controller中向NSMutableArray添加空值,进行测试

可以看出程序正常运行,先添加空值,后继续添加有效值,异常部分打印出来,后续操作不受影响。类似于容器添加空值,越界这种可能导致的异常,都可以使用这种办法进行处理,避免crash。

情景二:unrecognized selector sent to instance异常处理,避免crash

首先进行分析,这种情景和情境一不相同,情境一是已知某种存在的可能出异常的方法,进行方法交换处理,避免crash。而这种方法不存在就不能那么做了,因为是未知的不存在的方法,我们无法进行方法交换,那么怎么办呢?

思考一下runtime消息机制的方法寻找流程。

缓存查找-》类方法列表查找--〉父类方法列表查找--》而后进行方法决议,resolveInstanceMethod/resolveClassMethod两个方法进行处理-->消息转发-->方法签名,最后的消息分发-->还没有被处理,抛出方法未找到方法异常。

因为要避免crash,所以我们要找出流程中导致抛出异常的位置。即最后的方法签名,消息分发将要调用的两个方法着手,让其无法抛出异常,避免crash。

通过一个事例来进行代码测试,我们对NSArray调用addObject方法,通过重写消息转发流程方法,进行异常处理。上代码

1.首先我们先为NSObject创建一个分类

这里的警告意思是,我们添加的分类重写了原类的方法。

2.开始测试,在controller中导入写好的分类,然后NSArray调用addObject方法。

是不是成功了!!!我们通过NSArray类型调用不存在的addObject方法,避免了程序的crash,并打印出了问题信息。

相关文章

网友评论

      本文标题:异常捕获,避免程序crash

      本文链接:https://www.haomeiwen.com/subject/btnjnhtx.html