# 前言
一个类对象查找方法,我们都知道是先从缓存列表中去查找,然后在去方法列表里查找,这样就能快速的查找到相关的imp,但是当我们没有查找到相应的imp时,系统又会做一些什么事情呢?带着这样的好奇我们开始源码的探究,我们知道如果一个方法没有实现,运行时是会崩溃并且报错
## 动态方法解析
当我们在源码的动态方法解析过程做相应的事情时:程序就不会报错,可以继续执行并且进行我们想要的执行结果;其中核心代码来自resolveMethod_locked(inst, sel, cls, behavior);
if (slowpath(behavior & LOOKUP_RESOLVER)) {
behavior ^= LOOKUP_RESOLVER;
return resolveMethod_locked(inst, sel, cls, behavior);
}
## 原理解析
1 如果是对象方法,则在当前类对象中查找,因为对象方法就存储在当前类对象的方法列表中
2如果是类方法,先从本类中查找是否有该类的imp,如果找到就直接返回,如果还是没有找到,再对该类的元类,根元类,NSObject中查询,如果有就返回,没有就进行消息转发流程
3 消息转发 也分类两种情况,一种是快速转发,一种是慢速转发流程;
## 消息转发可以用来做什么
1.JSPatch --iOS动态化更新方案
2.实现多重代理
利用消息转发机制可以无代码侵入的实现多重代理,让不同对象可以同时代理同个回调,然后在各自负责的区域进行相应的处理,降低了代码的耦合程度。
3.间接实现多继承
Objective-C本身不支持多继承,这是因为消息机制名称查找发生在运行时而非编译时,很难解决多个基类可能导致的二义性问题,但是可以通过消息转发机制在内部创建多个功能的对象,把不能实现的功能给转发到其他对象上去,这样就做出来一种多继承的假象。转发和继承相似,可用于为OC编程添加一些多继承的效果,一个对象把消息转发出去,就好像他把另一个对象中放法接过来或者“继承”一样。消息转发弥补了objc不支持多继承的性质,也避免了因为多继承导致单个类变得臃肿复杂。