OC的消息机制简单介绍

在OC的消息机制中主要分为三个阶段,分别为:

1、消息发送阶段:从类以及父类的方法缓存列表和方法列表查找方法。

2、动态解析阶段:在消息发送阶段没有找到方法,则会进入这个阶段,负责动态添加方法实现。

3、如果没有实现动态解析方法,则会进行消息转发阶段,将消息转发给可以处理消息的接受者来处理。

如果以上都没有实现就会报出找不到方法的崩溃。

一、消息转发

首先判断这个对象是不是nil,如果是就相当于直接break,如果有,则会通过对象的isa指针找到这个类,在缓存的方法列表中查找,如果有则执行,没有则去方法列表中查找,如果没有通过superclass找到父类,在父类的缓存方法列表和方法列表中查找。

二、上述没有找到就会进入动态方法解析

根据是对象方法还是类方法会调用不同的方法:

类方法:resolveClassMethod

实例方法:resolveInstanceMethod

在方法中通过class_addMethod,动态添加方法的实现。

三、消息转发

通过签名,runtime生成了一个新的对象NSInvocation,发送给了forwardInvocation方法,在这个方法中让另外一个对象执行最开始的方法。如果forwardingTargetForSelector返回值不为空,就会让这个转发的目标处理消息。如果为nil,则会methodSignatureForSelector返回一个方法签名会调用forwardInvocation方法,根据NSInvocation修改方法的对象(方法的调用者,方法名,以及方法的参数)即可。如果methodSignatureForSelector返回为nil,则会doseNotRecognizeSelector方法内部。

最后都没有实现就会崩溃,因为找不到方法的实现。

posted @ 2020-05-01 20:17  _Ace  阅读(428)  评论(0编辑  收藏  举报