深入解析 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 用于存储与类有关的信息:
在 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 * 指针:
class_rw_t* data() {
以上是关于深入解析 Objective-C 中方法的结构的主要内容,如果未能解决你的问题,请参考以下文章
Swift之深入解析闭包Closures的使用和捕获变量的原理