4.1.Runtime 的基础知识
问题一:编译型语言和 Objective-C 这种动态运行时语言的区别是什么?
- 编译型语言由编译器决定最终代码。
- 动态运行语言,需要在运行的时候,才能具体确定调用的方法以及数据的类型。
问题二:消息传递和函数调用有怎么样的区别?
- 消息传递的语言,其运行时所执行的代码由运行期决定。
- 函数调用的语言,调用的方法则由编译期决定。
问题三:Objective-C 的动态性体现在哪里?
-
动态类型:例如 id 类型,在运行时决定。
-
动态绑定:代码要调用的方法,在编译期无法确定,运行时才能动态决定。
问题四:当我们调用的方法没有实现的时候,runtime是如何处理?

runtime 的主要技术知识点
4.2.学习 Runtime 需要了解的 C 语言相关知识
C 语言基础一:什么是结构体?
- 结构体是一种数据类型,它由我们自己来定义,可以包含基本数据类型也可以包含其他结构体。
- 既然结构体是一种数据类型,那么就可以用它来定义变量。
// 我们自定义的结构体
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
// 利用结构来定义变量
struct stu stu1, stu2;
C 语言基础二:什么是共用体?
- 共用体也被称为联合体,语法和结构体非常类似。
- 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,相互之间没有影响;而共用体的所有成员占同一段内存,修改一个成员会影响其他所有成员。
- 结构体占用的内存大于等于所有成员占用的内存总和(成员之间可能存在缝隙),共用体占用的内存等于最长的成员所占用的内存。
- 共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,会把原来成员的值覆盖掉。
4.3.Runtime 的主要需要了解的基础数据结构
- objc_object(即:对象 = id)
- objc_class
- isa指针
- method_t

objc_object 的结构体说明

objc_class 的结构体说明
isa 是什么?
- isa 指针是一个共用体或者说联合体。包括指针型 isa 和非指针型 isa,这样设计的目的是为了节约内存,展示更多数据。
- 关于对象,它的 isa 指向类对象。
- 关于类对象,它的 isa 指向元类对象。
- 如果我们调用的是一个实例方法,那么我们通过该实例的 isa 指针找到类对象,然后进行方法查找。
- 如果我们调用的是一个类方法,那么通过类对象的 isa 指针找到元类对象,然后进行方法查找。
cache_t是什么?
- 用于快速查找方法执行函数的缓存列表。
- 是可增量扩展的哈希表结构。
- 是计算机“局部性原理”的最佳应用。
cache_data_bits_t是什么?
- class_data_bits_t 主要是对 class_rw_t 的封装
- class_rw_t 代表了类相关的读写信息、对 class_ro_t 的封装
- class_ro_t 代表了类相关的只读信息

class_rw_t 的结构解析

class_ro_t 的结构

method_t 的结构

Type Encodings 技术的解析

runtime 的整体数据结构,需要能流利的说出来
哈希表是什么?
- Hash table 也叫 散列表。是根据键(key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数叫做散列函数,存放记录的数据称做散列表。
问题一:Class 是不是对象呢?
- Class 是对象,因为 Class = objc_class 他们继承自 objc_object 。
网友评论