美文网首页
IOS 动态方法解析和消息转发

IOS 动态方法解析和消息转发

作者: 一点东风 | 来源:发表于2020-06-27 01:20 被阅读0次

  好的!今天我们来练习IOS,当消息发送给没有实现该消息方法的对象时,会开始消息转发流程:动态方法解析->寻找备用接收者->消息转发,要是这三个步骤都没有进行未实现方法的处理,会抛出异常。

动态方法解析

  首先我们暴露了Dog类的talk,callBaaBaa,callMeowMeow实例方法,但是Dog类没有实现这些方法,所以当dog对象调用它们就会奔溃,因此在resolveInstanceMethod方法中我们需要为dog对象添加talk实例方法(是人类的talk方法)。

+ (BOOL)resolveInstanceMethod:(SEL)sel {
    if([NSStringFromSelector(sel) isEqualToString:@"talk"]) {
        //因为狗类没有实现talk方法,在动态方法解析时为狗类增加说话的此方法
        class_addMethod([self class], @selector(talk), class_getMethodImplementation([Humanity class], @selector(talk)),  "v@:");
    }
    return [super resolveInstanceMethod:sel];
}
寻找备用接收者

  然后dog对象调用callBaaBaa方法,同样它没有实现该方法,也没有在resolveInstanceMethod中添加callBaaBaa方法,在调用完resolveInstanceMethod后,会进行forwardingTargetForSelector方法,因此我们在forwardingTargetForSelector寻找羊类作为callBaaBaa的备用接收者防止奔溃。

- (id)forwardingTargetForSelector:(SEL)aSelector {
    //备用接收者羊处理消息
    if([NSStringFromSelector(aSelector) isEqualToString:@"callBaaBaa"]) {
        return sheep;
    }
    return [super forwardingTargetForSelector:aSelector];
}
消息转发

  最后我们的dog对象调用了没有实现的callMeowMeow方法,当进行完forwardingTargetForSelector方法之后会调用forwardInvocation方法进行消息转发的处理,所以我们在forwardInvocation中将消息转发给猫类防止奔溃。

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    SEL sel = [anInvocation selector];
    if([super respondsToSelector:sel]) {
        [super forwardInvocation:anInvocation];
    } else {
        [anInvocation invokeWithTarget:cat];//转发给猫类
    }
}

//重写methodSignatureForSelector,创建要转发的NSInvocation对象
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    if([super respondsToSelector:aSelector]) {
        return [super methodSignatureForSelector:aSelector];
    } else {
        return [cat methodSignatureForSelector:aSelector];
    }
}

最后,完整代码链接:https://github.com/arrosev/CMDTestProject

相关文章

  • Runtime(二)

    objc_msgSend 包括以下三个步骤 消息发送 动态方法解析 消息转发 消息发送 动态方法解析 消息转发 如...

  • unrecognized selector sent to in

    消息转发以及动态解析方法 消息转发机制基本上分为三个步骤: 动态方法解析 备用接收者 完整转发 首先,对于动态方法...

  • MG--iOS 消息机制

    msgSend 消息发送 动态方法解析 动态添加方法image.png 消息转发

  • IOS 动态方法解析和消息转发

      好的!今天我们来练习IOS,当消息发送给没有实现该消息方法的对象时,会开始消息转发流程:动态方法解析->寻找备...

  • Runtime

    定义 runtime 详解文章 1. 消息转发 动态方法解析(方法调用的必经之路) 快速转发(动态解析失败后,指...

  • iOS设计模式 (八) 代理模式消息机制

    消息机制 上图我们可以看出iOS消息机制是分三步, 动态方法解析,消息转发重定向,生成方法签名以及方法的签名派发来...

  • Runtime 方法调用本质(消息发送、动态方法解析、消息转发)

    动态方法解析、消息转发 如果方法实现(imp)没有找到会尝试一次动态方法解析,源码如 动态方法解析调用 "_cla...

  • 消息转发流程

    动态方法解析 备用接收者 完整消息转发

  • iOS-浅谈OC中的消息机制

    目录 简介消息发送objc_msgSend动态方法解析消息转发---- 转发接收者---- 转发调用补充---- ...

  • iOS 消息转发机制

    消息转发机制分为三步: 一、动态方法解析 二、快速消息转发 三、标准消息转发(normal forwarding)...

网友评论

      本文标题:IOS 动态方法解析和消息转发

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