OC的消息机制
2021-02-08 本文已影响0人
hyq1101
OC中的方法调用其实都是转成了objc_msgSend函数的调用,给receiver(方法调用者)发送了一条消息
objc_msgSend底层有3大阶段:消息发送阶段、动态方法解析阶段、消息转发阶段
isa、superclass指针.jpg
1、消息发送阶段
首先会判断消息接收者是否为空,如果为空,直接返回,如果不为空
通过isa指针找到类对象,从类对象的cache中查找,找到直接调用,找不到就从方法列表class_rw_t里面查找,找到直接调用并缓存到cache中,找不到就通过superclass指针找到父类的类对象,从父类类对象的cache中查找,找到直接调用并缓存到receiverClass的cache中,找不到就从父类类对象的方法列表class_rw_t里面查找,找到直接调用并缓存到receiverClass的cache中,找不到就继续通过superclass指针往上找,直到基类都找不到的话就进入动态方法解析阶段
2、动态方法解析阶段
首先会判断是否已进行过动态方法解析
否:会调用resolveInstanceMethod:方法来动态解析方法,并且标记为已经动态解析
是:进入消息转发阶段
3、消息转发阶段
调用forwardingTargetForSelector:方法看返回值是否为nil
否:objc_msgSend(返回值,SEL)
是:调用methodSignatureForSelector:方法进行方法签名
看返回值是否为nil
否:调用forwardInvocation:方法
是:调用doesNotRecognizeSelector:方法
objc_msgSend如果找不到合适的方法进行调用,会报错 unrecognized selector sent to instance