Runtime-(五)消息转发流程

我们先来看看实例方法的消息转发流程

Xnip2018-10-24_17-42-07.png

这里来说明一下流程

  1. 先调用resolveInstanceMethod:这个类方法,告诉系统我们是否需要通过消息转发来处理此方法。(如果是类方法,调用resolveClassMethod:这个方法),此方法的参数是方法选择器。
  2. 当我们返回YES,则相当于告诉系统,当前方法已处理,也就结束了消息转发流程。
  3. 如果返回NO,系统会再去找forwardingTargetForSelector:这个对象方法,这个对象的返回值就是告诉系统,这个方法(SEL),应当由哪个对象处理,系统会将这个方法转发给返回的这个转发目标,然后结束消息转发流程。
  4. 如果在forwardingTargetForSelector:方法我们返回nil,系统会再寻找methodSignatureForSelector:方法,这也是处理转发消息的最后一次机会。这个方法的返回值是NSMethodSignature,这个对象是对方法选择器的返回值类型以及参数个数和类型的一个封装。
  5. 当我们在forwardingTargetForSelector:返回了一个方法签名(NSMethodSignature),系统会调用forwardInvocation:方法。我们在这个方法中处理消息。到这里,消息转发流程就结束了。
  6. 但是如果我们在methodSignatureForSelector:返回nil,
[NSMethodSignature signatureWithObjCTypes:"v@:"];
// 这是我们之前说到的type encoding
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容