美文网首页
Runtime 消息转发

Runtime 消息转发

作者: docallsama | 来源:发表于2017-11-13 17:57 被阅读16次

目录

  1. 消息转发背景知识
  2. 消息转发使用方式
  3. 消息转发常见问题

消息转发背景知识

1.消息转发的定义
Objective-C的方法调用基于消息转发机制
编译器将如下代码

[alen normalRun]

编译成消息传递方法,即objc_msgSend 。需要传入接收者以及方法名

((NSString * (*)(id, SEL))(void *) objc_msgSend)((id)alen, @selector(normalRun))

消息转发使用方式

如果方法没有实现,则调用的时候会产生三次拦截
1.第一次拦截 resolveInstanceMethod
如果没有实现方法则首先会被 resolveInstanceMethod 方法拦截,此时可以通过 runtime 的 addMethod 来加入方法并进行调用。

+ (BOOL)resolveInstanceMethod:(SEL)sel {
    if (sel == @selector(run)) {
        //两种替换的方法
        
        //方法1:使用C语言方法
//        class_addMethod(self, sel, (IMP)run, "v@:");
        
        //方法2:使用OC方法
        class_addMethod(self, sel, class_getMethodImplementation([Person class], @selector(fakeRun)), "v@:");
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}

2.第二次拦截 forwardingTargetForSelector
第二次拦截可将方法转发到已经实现方法的实体类中

- (id)forwardingTargetForSelector:(SEL)aSelector {
    return self;
}

3.第三次拦截 methodSignatureForSelector
通过 methodSignatureForSelector 将方法转发到想要的实体类中,在对应实体类中

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    NSMethodSignature *signature = [jeep methodSignatureForSelector:aSelector];
    return signature;
}

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    SEL selector = [anInvocation selector];
    if ([jeep methodSignatureForSelector:selector]) {
        [anInvocation invokeWithTarget:jeep];
    } else {
        [super forwardInvocation:anInvocation];
    }
}

消息转发常见问题

1.class_copyMethodList 获取不到未实现的方法
2.category 覆盖类的方法
是在类的 MethodList 中添加 selector ,IMP 为 category 的名称

//通过category添加的方法
(iOSInterviewProblems`-[Person(MethodRun) normalRun] at Person+MethodRun.m:17)

//类添加的方法
(iOSInterviewProblems`-[Person normalRun] at Person.m:40)

示例参见 github Demo

相关文章

  • Effective Objective-C读后笔记(2)

    11、runtime消息转发机制 runtime的消息转发流程图消息转发 消息转发的示例实现 这里也给大家推荐一篇...

  • iOS - Runtime - 概念和方法交换

    runtime的概述runtime的相关概念runtime消息机制消息传递动态方法解析消息转发runtime的作用...

  • runtime底层实现原理

    一、Runtime介绍二、Runtime源码初探三、Runtime消息传递四、Runtime消息转发五、Runti...

  • runtime 消息转发

    实例方法的消息传递:消息的转发建立在objc_msgSend(id, SEL, ...)来实现的。首先会在类对象的...

  • Runtime 消息转发

    目录 消息转发背景知识 消息转发使用方式 消息转发常见问题 消息转发背景知识 1.消息转发的定义Objective...

  • Runtime消息转发

    我们还是先从实际代码入手吧,首先,我们先新建一个类,就Person类吧,大家刚学OC的时候用的最多的就是Perso...

  • runtime - 消息转发

    通过前边的学习我们知道,某个类或者对象调某个方法实际上就是给这个类/对象发送消息,如果我们某个对象要调用某个方法,...

  • Runtime - 消息转发

    引言 Objective-C作为iOS开发的主力语言(目前),将来必然被Swift替代。我们都知道在OC中我们是使...

  • Runtime消息转发

    消息转发是在查找IMP失败后执行一系列转发流程。 ①动态方法解析: 对象在收到无法解读的消息之后,首先将调用所属类...

  • Runtime — 消息转发

    前言 如果在动态解析阶段不做任何处理的话,我们调用一个未实现的方法会crash,下面来分析一下,crash之前系统...

网友评论

      本文标题:Runtime 消息转发

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