作者: 张炫赫
作为一个资深的技术团队,app的性能是我们技术团队首要的任务,其中最主要的一项就是app的崩溃率。
目前虽然不能把系统所有的crash都处理掉,不过一些常见的高频次发生的crash,系统都会处理。目前主要可以处理掉的crash类型有一下几种:
1.unrecognized selector crash
2.KVO crash
3.NSNotification crash
4.NSTimer crash
5.Container crash(数组越界,插nil等)
6.NSString crash (字符串操作的crash)
7.UI not on Main Thread Crash (非主线程刷UI(机制待改善))
下面会一一讲解如何解决这些carsh
unrecognized selector crash
unrecognized selector类型的crash是经常发生的carsh,我们要解决这个carsh就必须先了解它产生的具体原因和流程。
什么时候会报unrecognized selector的异常?
objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX
在找不到方法时,查找方法将会进入方法Forward流程,系统给了三次补救的机会,所以我们要解决这个问题,在这三次均可以解决这个问题
编辑
请点击输入图片描述
由上图可见,在一个函数找不到时,runtime提供了三种方式去补救:
1、调用resolveInstanceMethod给个机会让类添加这个实现这个函数
2、调用forwardingTargetForSelector让别的对象去执行这个函数
3、调用forwardInvocation(函数执行器)灵活的将目标函数以其他形式执行。
如果都不中,调用doesNotRecognizeSelector抛出异常。既然可以补救,我们可以用消息转发机制来做&