runtime 消息转发、方法交换

今天整理了iOS中相比较难一点的知识,但是作为一个iOS开发者,必须要掌握的技术点。下面我来描述下runtime机制

一、消息转发机制

  1、当消息发送一个对象时,他的依次执行顺序

  2、从运行时系统缓存使用过的方法中寻找

  3、objc_msgSend通过对象的isa指针获取到类的结构体,然后在方法分发表里面查找方法的selector。

  4、objc_msgSend结构体中的指向父类的指针找到其父类,并在父类的分发表里面查找方法的selector

  5、依此,会一直沿着类的继承体系到达NSObject类

  6、如果最后没有定位到selector,则会走消息转发流程
1)、动态方法解析

对象在接收到未知的消息时,首先会调用所属类的类方法

+resolveInstanceMethod:(实例方法)或者

+resolveClassMethod:(类方法)。

返回的是一个bool值:

YES 消息已处理

NO 消息未处理,进入备用接收者

2)、备用接收者

- (id)forwardingTargetForSelector:(SEL)aSelector

返回值是否为nil

nil为没有备用接收者,只能走完整消息转发了

非nil 作为消息的新接收者(不能是self本身,会出现死循环)

3)、完整消息转发

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector

- (void)forwardInvocation:(NSInvocation *)anInvocation

返回nil为不处理,只能崩溃了

非nil,若有方法签名,会转发到其他对象处理

二、方法交换

正常情况下,一个方法名对应一个IMP指针

如图所示:

image.png

方法交换后

方法名对应的IMP指针和其他的方法名对应的IMP指针做了交换

如图:

image.png

感谢博主详细讲解:----------

推荐阅读更多精彩内容