![](https://img.haomeiwen.com/i14844115/da41580f86ac7b5c.jpeg)
runtime 概念
runtime 简称运行时,
1)一套纯C语言的API.OC具有运行时机制;
2)将尽可能多的决策从编译时和链接时推迟到运行时(Apple官方解 释);
3)运行时系统充当着Object-C语言的操作系统,它使语言能够工作 (Apple官方解释)
特性:其编写的代码具有运行时、动态特性。
runtime用来干什么?用在哪些地方?
Objective-C程序在三个不同的层次上与运行时系统交互:
1) 通过Object-C源代码进行交互;
2) 通过NSObject类中定义的方法交互;
3) 通过直接调用运行时函数;
用来干什么 基本作用
1) 在程序运行过程中,动态的创建类,动态添加、修改这个类的
属性和方法;
2) 遍历一个类中所有的成员变量、属性、以及所有方法;
3) 消息传递、转发;
用在哪些地方 Runtime的典型事例
1) 给系统分类添加属性、方法;
2) 方法交换;
3) 获取对象的属性、私有属性;
4) 字典转换模型;
5) KVC、KVO;
6) 归档(编码、解码);
7) NSClassFromString class<->字符串;
8) block;
9) 类的自我检测
10) .....
runtime 定义
oc中的NSObject 对象中
![](https://img.haomeiwen.com/i14844115/014ab6359254ebe5.png)
上述中的isa指针是一个Class类型,他实质是一个指向objc_class的结构体指针。
可以使用clang命令查看编译的cpp文件,关于clang使用可以看我的浅拷贝深拷贝文章。
![](https://img.haomeiwen.com/i14844115/2a4e358e6559981b.png)
可以看到,id是指向一个objc_object 结构体的指针,而objc_object有一个isa指针指向objc_class;所以id和Class都是指向一个objc_class类型的结构体。
objc_class结构体结构如下:
![](https://img.haomeiwen.com/i14844115/946b1841494d9a5a.png)
在runtime使用当中,我们经常需要用到的字段:
isa Class对象,指向objc_class结构体的指针,也就是这个Class的MetaClass(元类)
1)类的实例对象的 isa 指向该类;该类的 isa 指向该类的 MetaClass
2)MetaCalss的isa对象指向RootMetaCalss
super_class Class对象指向父类对象
1)如果该类的对象已经是RootClass,那么这个super_class指向nil
2)MetaCalss的SuperClass指向父类的MetaCalss
3)MetaCalss是RootMetaCalss,那么该MetaClass的SuperClass指向该对象的RootClass
![](https://img.haomeiwen.com/i14844115/a405dc606c3f4754.png)
ivars: 类中所有属性的列表,使用场景:我们在字典转换成模型的时候需要用到这个列表找到属性的名称,去取字典中的值,KVC赋值,或者直接Runtime赋值
methodLists :类中所有的方法的列表,类中所有方法的列表,使用场景:如在程序中写好方法,通过外部获取到方法名称字符串,然后通过这个字符串得到方法,从而达到外部控制App已知方法。
cache:主要用于缓存常用方法列表,每个类中有很多方法,我平时不用的方法也会在里面,每次运行一个方法,都要去methodLists遍历得到方法,如果类的方法不多还行,但是基本的类中都会有很多方法,这样势必会影响程序的运行效率,所以cache在这里就会被用上,当我们使用这个类的方法时先判断cache是否为空,为空从methodLists找到调用,并保存到cache,不为空先从cache中找方法,如果找不到在去methodLists,这样提高了程序方法的运行效率。
protocols: 这个类中都遵守了哪些协议,使用场景:判断类是否遵守了某个协议上.
类底层代码、类的本质?
![](https://img.haomeiwen.com/i14844115/62d9d12be4186c66.png)
将Game文件编译为.cpp文件
![](https://img.haomeiwen.com/i14844115/9f4f2fa13a7368ef.png)
![](https://img.haomeiwen.com/i14844115/a3a11a17ed8258b3.png)
![](https://img.haomeiwen.com/i14844115/9c84335e3bc51853.png)
![](https://img.haomeiwen.com/i14844115/40167abe082b4a48.png)
上述是Object-C中类中基本的数据,了解了类的定义,我们基本可以这么理解,类就是多个结构体组合的一个集合体,类中的行为、习惯、属性抽象,按照机器能懂的数据存储到我们底层的结构体当中,在我们需要使用的时候直接获取使用。
类底层是如何调用方法?
![](https://img.haomeiwen.com/i14844115/7f718968b50807a5.png)
.cpp文件
![](https://img.haomeiwen.com/i14844115/a08716831160fa4e.png)
1)objc_msgSend :消息发送
2)objc_getClass: 获取对象
3) sel_registerName 获取方法的SEL
一个对象调用其方法,在Object-C中就是向这个对象发送一条消息,消息的格式
![](https://img.haomeiwen.com/i14844115/607e578a5c169330.png)
Rumtime是Objective-C语言动态的核心,Objective-C的对象一般都是基于Runtime的类结构,达到很多在编译时确定方法推迟到了运行时,从而达到动态修改、确定、交换...属性及方法
网友评论