mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-25 04:17:17 +00:00
docs: clang 插件开发
This commit is contained in:
@@ -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 对象的内存地址。
|
||||
|
||||
Reference in New Issue
Block a user