oc消息机制流程解析
2020-02-25 本文已影响0人
异乡人_4f2a
oc中的方法调用其实就是转成了_objc_msgSend函数的调用,给方法调用者发送了一条消息。
_objc_msgSend底层有三大阶段:消息发送、动态方法解析、消息转发
1、消息发送
以下为消息发送流程图:

2、动态方法解析:
调用+resolveInstanceMethod方法或者+resolveClassMethod方法
动态添加方法流程图:

例如为person对象动态添加test方法的实现
以下Person类中,只有test方法的声明,没有test方法的实现,通过resolveInstanceMethod方法动态添加一个other方法用来实现,这样就会在外面调用test方法时,不会报错


以下为动态添加对象方法的实现:

以下为动态添加类方法的实现:

3、消息转发
消息转发流程图:

例如调用person对象的test方法,最终通过消息转发给Cat类中的对象方法来实现:


备注:以下是拿对象方法进行的消息转发试验,类方法的消息转发也一样,只是将-改成+即可
