第四篇:Objective-C 知识回顾Runtime之一

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 语言基础二:什么是共用体?
  • 共用体也被称为联合体,语法和结构体非常类似。
  • 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,相互之间没有影响;而共用体的所有成员占同一段内存,修改一个成员会影响其他所有成员。
  • 结构体占用的内存大于等于所有成员占用的内存总和(成员之间可能存在缝隙),共用体占用的内存等于最长的成员所占用的内存。
  • 共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,会把原来成员的值覆盖掉。
语言基础三:.m 和 .mm 文件的有什么区别?
  • .mm 是 Objective-C 和 C++ 混合文件,可以调用 Objective-C 的类,也可以调用 C++的类。
  • .m 只能调用纯 Objective-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 。

推荐阅读更多精彩内容