一、代码分析方法查找流程
首先在当前类和父类还有NSObject都增加一个对象方法,实例化一个对象之后依次调用对象方法

从打印可以看出,每个方法都可以正常的调用到,但是要了 saySomething 创建的这个方法里面的时候就出来闪退,因为找不到这个方法的imp
再来调用类方法

可以看到原本是 NSObject 里的对象方法,通过
[LGStudent performSelector:@selector(sayMaster)];
LGStudent 类来调,竟然可以正常的调用,这是为什么呢?见下图

此时的这方分查找流程如上图
二、源码分析方法查找流程
还是在上一篇代码的基础上分析,从 _class_lookupMethodAndLoadCache3 开始分析

找到这个方法,然后再进去看它的实现

然后看到 查找实现或者转发 方法的返回,此时回到main函数,调用一个方法并在这里打个断点看这个函数是到底是什么意思

走到这里说明是没有缓存,有缓存不会走到这里,然后继续点进去看

if (cache) 这个判断是不用看的,因为上面传进来的时候传的是NO。

从从色方框这个方法点进去,查看实现,就是从 Method_list 里查找方法的一个过程

并且返回 m,继续看一下 search_method_list 二分查找方法的实现

再继续看 findMethodInSortedMethodList 的源码

二分查找的算法
当找到之后,回到 lookUpImpOrForward 这个方法里
就会执行 log_and_fill_cache 这个方法,填充cache进行缓存,原来cache缓存的终极入口在这里找到了
当当前类找不所调用方法的时候,就会去父类查找

显示去父类的 cache 找,找到了就填充到cache里,并直接 done 返回,要是找不到,就就会去到父类的方法列表里去找,如果找到就 done 返回,这就是整个过程,就跟 上面 isa 的那长图连接上了
验证:
调用一个student对象方法

然后在 lookUpImpOrForward 方法里的查找方法的地方打个断点

看到在当前调用的 student 对象的类的方法里有找到整个方法
接下来再用student调用一个NSObject的方法

在父类的父类也就是父类的元类里找到了。
三、方法崩溃的查找

在调用一个自己,父类,NSObject 都没有的方法的是会出现报错并崩溃,那这个报错信息是从那发出来的,跟着流程走一下

现在开始走查找 saySomething 的imp,

经过一系列的查找,然后并没有找到,然后来到这个方法,点进去看看

直接跳转到了这,然后再找一下

于是在这里找到了__objc_forward_handler,去掉一个下划线进行全局搜索一下

看到这赋值了 objc_defaultForwardHandler ,并且上这句的上面看到了objc_defaultForwardHandler的实现,里面竟然就是我们熟悉的保存信息,原来是从这里来的。
在我们实际开发过程中
[student performSelector:@selector(saySomething)];
直接写这么一句是会有提示的,刚才的演示代码里没报错,是因为写的一句
// 让编译器忽略错误
起了作用。
以上便是方法查找流程内容。