美文网首页
OC底层09:消息流程-三级容错机制

OC底层09:消息流程-三级容错机制

作者: ZAREMYDREAM | 来源:发表于2020-10-21 16:31 被阅读0次

前言

上章说到系统没有找到对应的方法实现时会进入resolveInstanceMethod动态决议流程。而实际消息流程中有三层容错机制:动态决议->快速转发->慢速转发。

动态决议

    if (! cls->isMetaClass()) {
        // try [cls resolveInstanceMethod:sel]
        resolveInstanceMethod(inst, sel, cls);
    } 
    else {
        // try [nonMetaClass resolveClassMethod:sel]
        // and [cls resolveInstanceMethod:sel]
        resolveClassMethod(inst, sel, cls);
        if (!lookUpImpOrNil(inst, sel, cls)) {
            resolveInstanceMethod(inst, sel, cls);
        }
    }

类方法的查找与实例方法的查找不同。
类方法的查找:

  1. 先找类的resolveClassMethod
  2. 再找元类及父类的resolveInstanceMethod
    原因:因为类方法实际是存放在元类的实例方法。
    动态决议流程
    创建一个Person类,定义- (void)test1+(void)test2不实现。
    调用执行这两个方法。
    Person中实现:

    运行结果如图:

快速转发流程

当动态决议未处理时,会进入快速转发流程- (id)forwardingTargetForSelector:(SEL)aSelector;

官方文档介绍
快速转发流程及给消息指定一个接收者。
定义一个Teaher类实现test1方法,然后再Person中实现:
- (id)forwardingTargetForSelector:(SEL)aSelector {
    NSLog(@"%@", NSStringFromSelector(aSelector));
    return [Teacher alloc];
}

执行结果如图:


慢速转发

当快速转发也不做处理时,进入慢速转发流程,系统不会做过多的处理,会将其当做事务抛出,谁需要谁去处理该方法。

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    return [NSMethodSignature signatureWithObjCTypes:"v@:"];
}

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    NSLog(@"%@", anInvocation);
}

如果谁需要这个方法,只需指定target
- (void)forwardInvocation:(NSInvocation *)anInvocation {
    anInvocation.target = [Teacher alloc];
    [anInvocation invoke];
}

ps:不执行,系统也不会崩溃,但浪费了性能。
整个容错机制如图:


相关文章

  • OC底层09:消息流程-三级容错机制

    前言 上章[https://www.jianshu.com/p/34fe5ca88565]说到系统没有找到对应的方...

  • iOS 底层原理 - 消息转发

    在上一篇 iOS 底层原理 - 消息查找流程中,我们知道OC消息机制分为三个阶段,消息发送,动态解析和消息转发,如...

  • Runtime知识点整理1

    OC消息机制?消息转发机制流程?什么是Runtime?什么场景下使用? ==============巴拉巴拉......

  • Runtime

    讲一下 OC 的消息机制 消息转发机制流程 什么是Runtime?平时项目中有用过么? OC的动态性是由Runti...

  • OC的消息机制总结

    OC的消息机制 流程总结:1.objc的消息机制,是通过objc_megSend 方法发送消息给 消息接受者,发...

  • iOS的消息转发机制

    一、简介: 消息转发是OC底层一种功能强大的实现,为OC方法的调用增加更多的表现力和容错能力。什么是消息转发?简单...

  • OC底层消息转发机制

    1. 前言 上一篇文章(OC底层方法的本质、查找流程[https://blog.csdn.net/guoyongm...

  • runtime消息机制

    OC:消息机制是运行时最重要的机制消息机制:任何方法调用,本质都是发送消息xcode5之后,苹果不建议调用底层方法...

  • OC-底层原理09—消息转发流程

    iOS--OC底层原理文章汇总[/p/14911da92f74] 在前面两章中介绍了方法消息的处理流程,宏观上来说...

  • iOS runtime

    runtime 是 oc 语音的基础首先runtime的核心机制是消息机制 也就是oc的消息机制首先oc的消息机制...

网友评论

      本文标题:OC底层09:消息流程-三级容错机制

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