docs: clang 插件开发

This commit is contained in:
杭城小刘
2024-04-27 13:01:58 +08:00
parent 6e47061735
commit 851797d133
257 changed files with 9060 additions and 239 deletions

View File

@@ -1,6 +1,8 @@
# Runtime
> 做很多需求或者是技术细节验证的时候会用到 Runtime 技术,用了挺久的了,本文就写一些场景和源码分析相关的文章
> 做很多技术项目或者业务项目、再或者是技术细节验证的时候会用到 Runtime 技术,用了挺久的了,本文就写、结合一些场景和源码分析来系统化学习
## 动态语言
@@ -8,11 +10,11 @@ Runtime 是实现 OC 语言动态的 API。
静态语言:在编译阶段确定了变量数据类型、函数地址等,无法动态修改。
动态语言:只有在运行的时候才可以决定变量属于什么类型、方法真正的地址
动态语言:只有在运行的时候才可以决定变量属于什么类型、方法真正的地址
对象 `objc_object` 存了isa、成员变量的值
类 objc_class: superclass、成员变量、实例变量
`objc_class` 存了isa、 superclass、成员变量、实例变量、对象方法、协议
```objectivec
@interface Person : NSObject
@@ -26,17 +28,19 @@ malloc_size((__bridge const void *)(p)) // 24 isa占8字节 + _name 指针占
class_getInstanceSize(p.class) // 32 ,系统内存对齐
```
为什么系统是由16字节对齐的
成员变量占用8字节对齐,每个对象的第一个都是 isa 指针必须要占用8字节。举例一个极端 case假设 n 个对象,其中 m 个对象没有成员变量,只有 isa 指针占用8字节其中的 n-m个对象既有 isa 指针,又有成员变量。每个类交错排列,那么 CPU 在访问对象的时候会耗费大量时间去识别具体的对象。很多时候会取舍,这个 case 就是时间换空间。以16字节对齐会加快访问速度参考链表和数组的设计
成员变量占用 8 字节对齐,每个对象的第一个都是 isa 指针必须要占用8字节。举例一个极端 case假设 n 个对象,其中 m 个对象没有成员变量,只有 isa 指针占用8字节其中的 n-m个对象既有 isa 指针,又有成员变量。每个类交错排列,那么 CPU 在访问对象的时候会耗费大量时间去识别具体的对象。很多时候会取舍,这个 case 就是时间换空间。以16字节对齐会加快访问速度参考链表和数组的设计
## class_rw_t、class_ro_t、class_rw_ext_t 区别?
class_ro_t 在编译时期生成的class_rw_t 是在运行时期生成的。
`class_ro_t` 在编译时期生成的,`class_rw_t` 是在运行时期生成的。
那么什么是 `class_rw_ext_t`?首先明确2个概念
那么什么是 `class_rw_ext_t`首先明确2个概念
- clean memory加载后不会被修改。当系统内存紧张时可以从内存中移除需要时可以再次加载
@@ -58,14 +62,18 @@ const method_array_t methods() const {
}
```
## 有类对象、为什么设计元类对象
复用消息机制。比如 `[Person new]`
元类对象: isa、元类方法、
元类对象isa、元类方法、
`objc_msgSend` 设计初衷就是为了消息发送很快。假如没有元类,则类方法也存储在类对象的方法信息中,则可能需要加额外的字段来标记某个方法是类方法还是对象方法。遍历或者寻找会比较慢。所以引入元类(单一职责),设计元类的目的就是为了提高 `objc_msgSend` 的效率。
## isa 本质
在 arm64 架构之前isa 就是一个普通的指针,存储着 Class或Meta-Class 对象的内存地址。