消息转发机制

2020-01-02  本文已影响0人  CS_SDN

1.动态方法解析

对象在无法解读消息会首先调用所属类的下列类方法:

+ (BOOL) resolveInstanceMethod:(SEL)selector

2.快速消息转发

寻找是否在其他对象内有该方法实现,并将该消息转发给这个对象

-(id)forwardingTargetForSelector:(SEL)selector

如果目标对象实现了该方法,Runtime这时就会调用这个方法,给你把这个消息转发给其他对象的机会.只要这个方法返回的不是nil和self,整个消息发送的过程就会被重启,当然返回的对象会变成return的对象,否则就会继续nurmal fowarding

3.标准消息转发(normal forwarding)

这一步是消息转发的最后一步,首先会发送

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector 

消息获得函数的参数和返回值,如果返回nil,runtime则会发出doesNotRecognizeSelector消息,然后crash,若是返回了一个函数签名,runtime就会创建一个NSInvocation对象并发送

- (void)forwardInvocation:(NSInvocation *)Invocation 

消息给目标对象

总结:

  1. objc_msgSend在进行MethodTableLookup常规查找 imp 缓存
  2. 如果缓存没有找到imp,则进行慢速递归
  3. 慢速递归如果也没有找到,则意味着即将奔溃,即无imp

如上情况继续分析:

  1. 是否有特殊处理,如果有:对底层动态进行决议和解析
  2. 如果没有特殊处理,有没有交给别人处理
  3. 如果没有交给别人去处理,意味着这些方法你不想处理,但是任要实现
    1.methodSignatureForSelector(),进行方法签名,把方法丢出去
    2.forwardInvocation()来对消息处理


    消息转发流程图
上一篇 下一篇

猜你喜欢

热点阅读