iOS 底层原理探索 之 isa – 类的底层原理结构(下)

前言: iOS底层原理探究是本人在平时的开发和学习中不断积累的一段进阶之
路的不断探索之旅,希望能有帮助到各位读者朋友。
复制代码

目录如下:

  1. iOS 底层原理探索 之 alloc
  2. iOS 底层原理探索 之 结构体内存对齐
  3. iOS 底层原理探索 之 对象的本质 & isa的底层实现
  4. iOS 底层原理探索 之 isa – 类的底层原理结构(上)
  5. iOS 底层原理探索 之 isa – 类的底层原理结构(中)

写在前面

在之前的系列文章中,我们从开发中使用最多和最基础的 alloc 开始,探索了其底层的流程,以及类底层结构体的内存知识,接着关于对象的本质和其内部isa的底层实现,进一步的,我们探索了类的bitscache

那么,本片作为类的底层原理结构的收官内容,我会从整体来总结下。

准备

来自苹果WWDC2020关于 Objective-C 运行时做出的更改

Objective-C运行时的进步

深入到每个Objective-C和Swift类背后的低级位元和字节的微观世界。
了解最近对内部数据结构、方法列表和标记指针的更改如何提供更好的性能
和更低的内存使用。我们将演示如何识别和修复取决于内部细节的代码崩溃,
并向您展示如何保持代码不受运行时更改的影响。
复制代码
  • clean memory 是指加载后不会发生改变的内存。(class_ro_t 就属于 clean memory 因为他是只读的)
  • dirty memory 是指在进程运行时会发生更改的内存。(类结构一经使用就会变成 dirty memory,因为运行时会向他写入新的数据,例如 创建一个新的方法缓存并从类中指向它)
  • dirty memoryclean memory昂贵得多。它必须在进程运行期间一直存在。另一方面,可以排除clean memory,为其他东西腾出空间,因为如果您需要它,系统总是可以从磁盘重新加载它。macOS有交换dirty memory的选项,但dirty memory在iOS中特别昂贵,因为它不使用交换。

磁盘上app二进制文件中的类

它包含最频繁访问的信息:指向元类、超类和方法缓存的指针。
image.png

当类第一次从磁盘加在到内存时的结构

它还有一个指针,指向存储其他信息的更多数据,称为class_ro_t
Ro代表只读。这包括类的名称和关于方法、协议和实例变量的信息。Swift类和Objective-C类共享这个基础设施,所以每个Swift类也有这些数据结构。

image.png

当类第一次被使用时

当一个类第一次被使用时,运行时将为它分配额外的存储空间。
这个运行时分配的存储是class_rw_t,用于读/写数据。
在这个数据结构中,我们存储只在运行时生成的新信息。当一个类别被加载时,它可以向类中添加新方法,程序员可以使用运行时api动态地添加它们。
因为class_ro_t是只读的,所以我们需要跟踪class_rw_t中的这些内容。

image.png

类的整体结构

将通常不使用的部件分开,这样 class_rw_t 的大小减少了一半
image.png

cache_tinsert() 调用的时机

通过源码断点调试,我们在堆栈信息中可以找到

image.png

log_and_fill_cache

lookUpImpOrForward

这就是,之后我们要去探索的关于消息发送转发和查找的相关流程内容。

补充

  • 面试题

image.png

未完待续…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享