美文网首页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原理及使用场景

    一,Runtime 是什么? Objective-C是一门面向对象的动态语言,该语言采用“消息结构”,其运...

  • iOS Runtime原理及使用

    本文参考七七 iOS Runtime原理及使用,非常感谢该作者 runtime简介 因为Objc是一门动态语言,所...

  • iOS Runtime 原理及使用

    1.runtime简介 因为Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时。也就是说...

  • iOS Runtime原理及使用

    一、runtime简介 Runtime简称运行时。OC就是运行时机制,其中最主要的是消息机制。对于C语言,函数的调...

  • iOS-Runtime原理及使用

    Runtime原理 1.Runtime简称运行时.OC就是运行时机制,(就是系统在运行的时候的一些机制)其中最主要...

  • runtime(一)--runtime

    iOS Runtime原理 runtime的原理 ios的sdk中 usr/include/objc文件夹下面有这...

  • iOS开发·runtime原理与实践: 基本知识篇

    iOS开发·runtime原理与实践: 基本知识篇 iOS开发·runtime原理与实践: 基本知识篇

  • runtime用法详解

    版本:iOS13.5 本方翻译了runtime的方法及使用方式。 runtime.h(一)runtime.h(二)...

  • 2019-03-02

    Runtime Objective-C Runtime iOS底层原理探究-Runtime isa 和 Class...

  • iOS面试基础知识 (一)

    作者:akon 原文地址: 一、Runtime原理 Runtime是iOS核心运行机制之一,iOS App加载库、...

网友评论

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

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