美文网首页iOS 开发继续加油
Runtime消息传递机制

Runtime消息传递机制

作者: 昵称是乱起的 | 来源:发表于2019-01-22 00:29 被阅读73次
先看下整个Class的底层结构
image.png

objc_msgSend的源码是汇编实现的

objc_msgSend的执行流程01-消息发送
image.png

如果是从class_rw_t中查找方法,已经排序的采用二分查找,没有排序的遍历查找
receiver通过isa指针找到receiverClass
receiverClass通过superclass指针找到superClass

objc_msgSend的执行流程02-动态方法解析
image.png

动态解析过后,会重新走“消息发送”的流程,“从receiverClass的cache中查找方法”这一步开始执行
开发者可以实现以下方法,来动态添加方法实现
+resolveInstanceMethod:
+resolveClassMethod:

#InstanceMethod第1种写法
- (void)other
{
    NSLog(@"%s",__func__);
}
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    if (sel == sel_registerName("test")) {
        Method method = class_getInstanceMethod(self, sel_registerName("test"));
        class_addMethod(self, sel, method_getImplementation(method), method_getTypeEncoding(method));
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}
#InstanceMethod第2种写法
void c_other(id self, SEL _cmd)
{
    NSLog(@"c_other - %@ - %@", self, NSStringFromSelector(_cmd));
}
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    if (sel == @selector(test)) {
        class_addMethod(self, sel, (IMP)c_other, "v16@0:8");
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}
#InstanceMethod第3种写法
struct method_t {
    SEL sel;
    char *types;
    IMP imp;
};
- (void)other
{
    NSLog(@"%s",__func__);
}
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    if (sel == @selector(test)) {
        struct method_t *method = (struct method_t *)class_getInstanceMethod(self, @selector(other));
        class_addMethod(self, sel, method->imp, method->types);
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}
#ClassMethod写法
void c_other(id self, SEL _cmd)
{
    NSLog(@"c_other - %@ - %@", self, NSStringFromSelector(_cmd));
}
+ (BOOL)resolveClassMethod:(SEL)sel
{
    if (sel == @selector(test)) {
        class_addMethod(object_getClass(self), sel, (IMP)c_other, "v16@0:8");
        return YES;
    }
    return [super resolveClassMethod:sel];
}

objc_msgSend的执行流程03-消息转发
image.png
+ (id)forwardingTargetForSelector:(SEL)aSelector
{
    if (aSelector == @selector(test)) return [[Person alloc] init];
    return [super forwardingTargetForSelector:aSelector];
}
//上面return NO才会来到这里
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    if (aSelector == @selector(test:)) {
        return [NSMethodSignature signatureWithObjCTypes:"i@:i"];
    }
    return [super methodSignatureForSelector:aSelector];
}
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    [anInvocation invokeWithTarget:[[Person alloc] init]];
}

@dynamic value;// 提醒编译器不要自动生成setter和getter的实现、不要自动生成成员变量

super底层
 [self class];
 objc_msgSend(self, sel_registerName("class"))
 [super superclass];
 objc_msgSendSuper({self,class_getSuperclass(objc_getClass("Person"))}, sel_registerName("class")))

相关文章

  • Runtime 的应用

    前面我们说到:Runtime 消息传递机制Runtime 消息转发机制Runtime 交换方法今天我们来谈谈Run...

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

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

  • iOS消息转发机制

    消息转发机制: 消息转发机制是相对于消息传递机制而言的。 1、消息(传递)机制 RunTime简称运行时。就是系统...

  • Runtime 消息传递机制

    求婚时,想给女友买颗好钻戒,那颗他曾参与撰写文案的优雅钻戒,承载着他的所有想象和创造力,很多人被他的文案打动,而他...

  • Runtime消息传递机制

    先看下整个Class的底层结构 objc_msgSend的源码是汇编实现的 objc_msgSend的执行流程01...

  • Objective-C Runtime浅析

    前言 Runtime是什么 Runtime的实现原理消息传递机制Runtime基础数据结构NSObject & i...

  • iOS 底层 - 名词解析

    目录 前言 名词解析 OC消息传递和转发机制 Runtime runtime动态创建类 Runloop Metho...

  • Runtime(一)消息传递机制

    Introduction The Objective-C language defers as many deci...

  • Runtime的工作原理(二)

    接着前面的说,之前说了runtime的交互、runtime的消息机制、传递、方法地址获取。 四、Dynamic M...

  • Runtime消息传递和消息转发|你一定看得懂

    Runtime简介==== Runtime的特性主要是消息(方法)传递机制,当向对象发送一条消息时,如果能在对象的...

网友评论

    本文标题:Runtime消息传递机制

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