深入解析 Objective-C 中方法的结构

Posted Cocoa开发者社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入解析 Objective-C 中方法的结构相关的知识,希望对你有一定的参考价值。



因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。


在上一篇分析 isa 的文章《》中曾经说到过实例方法被调用时,会通过其持有 isa 指针寻找对应的类,然后在其中的 class_data_bits_t 中查找对应的方法,在这一篇文章中会介绍方法在 Objective-C 中是如何存储方法的。


这篇文章的首先会根据 ObjC 源代码来分析方法在内存中的存储结构,然后在 lldb 调试器中一步一步验证分析的正确性。


方法在内存中的位置


先来了解一下 ObjC 中类的结构图:

  • isa 是指向元类的指针,不了解元类的可以看:

  • super_class 指向当前类的父类

  • cache 用于缓存指针和 vtable,加速方法的调用

  • bits 就是存储类的方法、属性、遵循的协议等信息的地方


class_data_bits_t 结构体


这一小结会分析类结构体中的 class_data_bits_t bits。


下面就是 ObjC 中 class_data_bits_t 的结构体,其中只含有一个 64 位的 bits 用于存储与类有关的信息:

深入解析 Objective-C 中方法的结构

在 objc_class 结构体中的注释写到 class_data_bits_t 相当于 class_rw_t 指针加上 rr/alloc 的标志。


class_data_bits_t bits;// class_rw_t * plus custom rr/alloc flags


它为我们提供了便捷方法用于返回其中的 class_rw_t * 指针: