美文网首页
runtime 消息机制

runtime 消息机制

作者: 你若安好就是晴天_8ee6 | 来源:发表于2018-11-23 13:17 被阅读0次

    对于一条消息的处理逻辑

    1系统先找到这个消息的执行对像

    2:通过执行对象的isa找到 他的类

    3每个类都有一个对像方法列表和元类的方法列表,在方法列表中找相应的selector 如果找不到找super类的selector

    4:执行selector对应的imp 

    5:转发imp 的return值

    判断receiver是否为nil,如果是nil的话则不往下执行,返回nil,这就是为什么在oc中一个nil发送消息不会引起奔溃。

    1、从方法的缓存中查找被调用过的方法会存在缓存里面,每个类都会有一个表来存被调用过的方法,以便下次更快的调用。

    2、从本类的方法表(dispatch table)中查找方法寻找selector,找到则写入缓存,返回方法。否则再从父类中查找方法,如此往复,直到达到基类。如果找不到则执行方法的动态解析。

    3、方法的动态解析:调用+ (BOOL)resolveInstanceMethod:(SEL)sel方法来查看是否能够返回一个selector,如果存在则返回selector。不存在进入下一步。

    4、备用接受者- (id)forwardingTargetForSelector:(SEL)aSelector这个方法来询问是否有接受者可以接受这个方法呀。如果有人接受,则交给它处理,就好像一切都没发生过一样。

    5、方法的转发:如果到这一步还不能够找到相应的Selector的话,就要进行完整的方法转发过程。调用方法(void)forwardInvocation:(NSInvocation *)anInvocation

    最后还是没有找到的话就只有呵呵了,这时候unrecognized selector sent to instance 0x100111df0'的错误就来了。

    作者:HarriesChen

    链接:https://www.jianshu.com/p/64ed325c1f19

    來源:简书

    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    相关文章

      网友评论

          本文标题:runtime 消息机制

          本文链接:https://www.haomeiwen.com/subject/bkltqqtx.html