在某大佬那里扒来的大概步骤,懒得写了,后面会自己进行代码分析。
利用 分类(category) + runtime + 异常的捕获 来防止Foundation一些常用方法使用不当而导致的崩溃。其原理就是利用category、runtime来交换两个方法,并且在方法中捕获异常进行相应的处理。
1、通过category给类添加方法用来替换掉原本存在潜在崩溃的方法。
2、利用runtime方法交换技术,将系统方法替换成我们给类添加的新方法。
3、利用异常的捕获来防止程序的崩溃,并且进行相应的处理
链接:https://www.jianshu.com/p/8e816b4dbdb6
来源:简书
下面自己进行代码测试分析,上代码
情景一:向mutableArray添加空值,避免crash。并能打印异常
1.首先为NSMutableArray创建分类,添加方法用于替换可能出错的方法。
![](https://img.haomeiwen.com/i20116762/cd0e862945826ab4.png)
2.在controller中向NSMutableArray添加空值,进行测试
![](https://img.haomeiwen.com/i20116762/6b29021f59ef35f6.png)
可以看出程序正常运行,先添加空值,后继续添加有效值,异常部分打印出来,后续操作不受影响。类似于容器添加空值,越界这种可能导致的异常,都可以使用这种办法进行处理,避免crash。
情景二:unrecognized selector sent to instance异常处理,避免crash
首先进行分析,这种情景和情境一不相同,情境一是已知某种存在的可能出异常的方法,进行方法交换处理,避免crash。而这种方法不存在就不能那么做了,因为是未知的不存在的方法,我们无法进行方法交换,那么怎么办呢?
思考一下runtime消息机制的方法寻找流程。
缓存查找-》类方法列表查找--〉父类方法列表查找--》而后进行方法决议,resolveInstanceMethod/resolveClassMethod两个方法进行处理-->消息转发-->方法签名,最后的消息分发-->还没有被处理,抛出方法未找到方法异常。
因为要避免crash,所以我们要找出流程中导致抛出异常的位置。即最后的方法签名,消息分发将要调用的两个方法着手,让其无法抛出异常,避免crash。
通过一个事例来进行代码测试,我们对NSArray调用addObject方法,通过重写消息转发流程方法,进行异常处理。上代码
1.首先我们先为NSObject创建一个分类
![](https://img.haomeiwen.com/i20116762/8c6322c186ce8ca6.png)
这里的警告意思是,我们添加的分类重写了原类的方法。
2.开始测试,在controller中导入写好的分类,然后NSArray调用addObject方法。
![](https://img.haomeiwen.com/i20116762/76c543c64dadc3e3.png)
是不是成功了!!!我们通过NSArray类型调用不存在的addObject方法,避免了程序的crash,并打印出了问题信息。
网友评论