美文网首页iOS 大神之路
iOS Runtime原理及使用场景

iOS Runtime原理及使用场景

作者: 329fd8af610c | 来源:发表于2017-09-14 08:57 被阅读9次

    一,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类实现归档与反归档代码更清晰,更简洁。

    图四-1 图四-2 图四-3

    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方法。

    图六-1 图六-2

    相关文章

      网友评论

        本文标题:iOS Runtime原理及使用场景

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