这篇文章主要整理一下面试中会问到的一个知识点:Runtime相关知识点
一,Runtime 是什么?
Objective-C是一门面向对象的动态语言,该语言采用“消息结构”,其运行时所应执行的代码由运行环境决定,编译期间,编译器不能决定真正调用哪个函数,甚至不关系消息接收者是何种类型,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用,也就是说只有编译器是不够的,还需要一个运行时系统来执行编译后的代码。
Runtime简称运行时,基本是用C和汇编写的,是OC代码底层的实现方式,Runtime在整个OC运行时机制中发挥重要作用,因此是整个Objc运行框架的一块重要的基石。
二,Runtime相关的文件
2.1 相关文件
都是和运行时相关的头文件,其中主要使用的函数定义在message.h和runtime.h这两个文件中。 在message.h中主要包含了一些向对象发送消息的函数,这是OC对象方法调用的底层实现。
#import <objc/runtime.h> : 运行时机制,
#import <objc/message.h> : 消息机制,
2.2 类型声明
typedefstructobjc_ivar *Ivar : 代表实例(对象)的变量,
typedefstructobjc_category *Category : 代表一个分类,
typedefstructobjc_property *objc_property_t : 代表OC声明的属性,
typedef struct objc_method *Method :代表一个方法,
typedef struct objc_ivar *Ivar :代表一个成员变量
2.3 函数的定义
对对象进行操作的方法一般以object_开头
对类进行操作的方法一般以 class_ 开头
对类或对象的方法进行操作的方法一般以 method_ 开头
对成员变量进行操作的方法一般以 ivar_ 开头
对属性进行操作的方法一般以 property_ 开头
对协议进行操作的方法一般以 protocol_ 开头
三,Runtime如何去使用
3.1 消息发送机制
oc中任意方法的调用最终都会转化成调用id objc_msgSend(id self, SEL op, ...)底层方法,使用消息机制的前提是 #import <objc/message.h>,id self指的是消息接收者,SEL op指的是选择的方法名,两个参数是隐式传入,该方法需要在接收者所属的类中搜寻其“方法列表”,如果能找到与选择子名称相符的方法,跳至其实现代码,若是找不到,沿着继承体系向上寻找,跳至其实现代码,如果最终没有找到,需要执行“消息转发”机制。
以3.5 简单模仿KVO机制 中给父类添加setName为例
3.2 交换方法
交换方式适用在某一个类中的系统方法多次调用,项目需求发生改变时,使用另一种方法来完善系统方法,处理原则是不改变旧的项目,在类的分类中,新添加一个方法,load方法中交换两个方法即可。
3.3 自定义类的归档与反归档
适用在当一个自定义的model类中的属性有点多时,model类实现归档与反归档代码更清晰,更简洁。
3.4 关联对象
关联对象适用在不继承superClass的情况下给superClass关联一个或者多个对象,这些对象通过“键”来区分,可以指明“存储策略”,用于维护相应的“内存管理语义”,本质就是将两个对象关联起来,模仿定义属性时采用的“拥有关系”与“非拥有关系”确定两者之间的关系。
3.5 简单模仿KVO机制
1.当A对象添加观察者C之后,系统自动生成一个继承A类的B类,
2.A对象添加观察者C前后,调用 [A Class],返回的是同一个对象,其实不是,类B重写 class方法,将自己伪装成类A。类B还会重写dealloc方法释放资源,
3.A对象添加完观察者C之后,系统将所有指向类A对象的isa指针指向类B的对象,
4.在B类中重写监听某属性的setter方法,一旦setter方法调用,发送通知给C,调用observeValueForKeyPath方法。