美文网首页
iOS消息发送的调用过程

iOS消息发送的调用过程

作者: 林风098 | 来源:发表于2020-11-18 16:16 被阅读0次

    iOS方法的调用过程

    [object methodA]
    runtime层会将这个方法翻译成
    objc_msgSend(id self, SEL op, ...)
    而objc_msgSend具体如何进行分发呢?

    1.方法先经过缓存查找,方法列表查找后,后进入动态方法解析阶段

    + (BOOL)resolveInstanceMethod:(SEL)sel;
    - (BOOL)resolveInstanceMethod:(SEL)sel;
    

    如果类没有实现这个方法,那么消息就没有转送,就进行类和对象的动态方法决议。
    为发送消息的对象的添加一个IMP,然后再让该对象去处理
    如果实现了这个方法,会接受到一个bool值,表示转发是否成功。

    - (id)forwardingTargetForSelector:(SEL)aSelector;//返回接受的对象
    

    如果3方法没有实现就会走到这边,快速消息转发

    将该消息转发给能处理该消息的对象

    这个主要作用是:这个方法这个类没有实现,但是我知道其他的类实现了,就把这个类的方法转发给其他类。操作无效依旧crash

    - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector //返回一个方法签名
    
    - (void)forwardInvocation:(NSInvocation *)anInvocation //方法实现操作
    

    如果4方法没有实现,就会走到这里慢速消息转发

    第一个方法生成方法签名,然后创建
    NSInvocation 对象作为参数给第二个方法,然后在forwardInvocation 方法里面做消息处理,
    只要在第二个方法里面不执行父类的方法,即使不处理也不会崩溃

    5.unrecognized selector sent to instance
    如果上述所有都没有实现就会crash,并报出如下信息。

    整体流程图


    16056839197261.jpg 16056854954116.jpg

    具体使用可用于两个方面
    1.防止循环引用。
    2.AOP切面工程。

    相关文章

      网友评论

          本文标题:iOS消息发送的调用过程

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