美文网首页iOS 开发 Objective-C
第四篇:Objective-C 知识回顾Runtime之一

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

作者: 望穿秋水小作坊 | 来源:发表于2019-11-12 15:26 被阅读0次

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 。

相关文章

网友评论

    本文标题:第四篇:Objective-C 知识回顾Runtime之一

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