Runtime(消息转发机制)

2021-03-12  本文已影响0人  迷失的信徒

1、什么是Runtime

Runtime->运行时机制,最主要的是消息机制,是一套比较底层的纯C语言API,属于一个C语言库,包含了很多了很多底层的C语言API。
我们平时所编写的OC代码,在程序运行时,最终都会转成Runtime的C语言代码,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才能根据函数名称找到对应的函数来调用。Runtime算是OC的幕后工作者,objc_msgSend。

2、Runtime使用场景

3、消息机制

3.1消息转发的原理

    当向一个对象发送消息时,objc_msgSend方法根据对象的isa指针找到对象的类,然后再类的调度表(dispatch table)中查找selector。如果无法找到selector,objc_msgSend会通过指向父类的指针找到父类,并在父类的调度表(dispatch table)中查找selector,以此类推到NSObjcet类。一旦找到selector,objc_msgSend方法根据调度表的内存地址调用该实现。通过这种方式,message与方法的真正实现在执行阶段才绑定。
    为了保证消息发送和执行的效率,系统会将全部的selector和使用过的方法的内存地址缓存起来。每个类都有一个独立的缓存,缓存包含有当前类自己的selector以及集成自父类的selector。查找调度表(dispatch table),消息发送系统首先检查receiver对象的缓存。
    缓存命中的情况下,消息发送(messaging)比直接调用方法(function call)只慢一点点点点。

3.2、SEL isa super cmd
3.3、动态绑定

在运行时确定要调用的方法

    动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的 调用并不和代码绑定在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因 子负责确定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者 的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C 代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时,特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而透明地发生

3.4当找不到方法的时候:

①、runtime首先进入动态方法分析获取IMP,调用 + resolveInstanceMethod 或 + resolveClassMethod 尝试获取 IMP。
②、没有IMP时,进入快速消息转发,进入快速消息转发,调用 - forwardingTargetForSelector: 尝试获取一个可以处理的对象。
③、仍没有处理,进入慢速转发,调用 - methodSignatureForSelector: 获取到方法签名后,将消息封装为一个invocation 再调用 - forwardInvocation: 进行处理。

4、动态添加属性
#import <objc/runtime.h>
/** <#注释#> */
@property (nonatomic,copy) NSString *name;

- (void)setName:(NSString *)name{
    objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSString *)name{
    return objc_getAssociatedObject(self, @"name");
}

使用要引入分类头文件
#import "NSObject+son.h"
NSObject *objc = [[NSObject alloc] init];
    objc.name = @"text";
上一篇 下一篇

猜你喜欢

热点阅读