docs: image url

This commit is contained in:
FantasticLBP
2026-01-02 10:28:57 +08:00
parent 7ac7513900
commit 7843661458
29 changed files with 719 additions and 719 deletions

View File

@@ -284,7 +284,7 @@ NSObject 是 Objective-C 的根类,定义了对象的基本行为:
### `p.run()` 底层是怎么调用的?
Demo1: Swift 调用 Swift 对象方法
<img src="./../assets/SwiftCallSwiftAssemble.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftCallSwiftAssemble.png" style="zoom:30%" />
纯 Swift 环境中,调用对象的方法,走的是虚表的逻辑。最终底层会调用 `callq *0x78(%rax)`
@@ -296,7 +296,7 @@ Demo2: OC 调用 Swift 对象方法
3. OC 方法中调用 Swift 对象和方法
4. 给 OC 环境中,调用 Swift 对象方法的地方下个断点,查看走的是 OC 的 Runtime 还是 Swift 的虚函数表的逻辑
断点截图如下:
<img src="./../assets/OCCallSwiftAssemble.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/OCCallSwiftAssemble.png" style="zoom:30%" />
可以看到在 OC 环境中,调用 Swift 对象的方法,本质上走的是 Runtime 的流程,汇编可以看到走的是 `objc_msgSend` 流程,效果类似 `objc_msgSend(p, @selector(run))`
@@ -310,7 +310,7 @@ Demo3: 暴露给 OC 的 Swift 对象,被 Swift 环境调用
3. 在 Swift 环境中调用暴露给 OC 的 Swift 对象方法
4. 断点查看方法调用的本质
<img src="./../assets/SwiftClassExposedToOCThenCalledBySwift.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftClassExposedToOCThenCalledBySwift.png" style="zoom:30%" />
可以看到,在 Swift 环境中,即使某个 Swift 类暴露给了 OC调用其对象方法的本质依旧是走虚函数表。因为此时用不到 Runtime 的能力
Demo4: 在 Demo3 的基础上swift 方法内部调用 OC 对象方法
@@ -321,8 +321,8 @@ Demo4: 在 Demo3 的基础上swift 方法内部调用 OC 对象方法
3. 在 sayHi 方法内部,调用 OC Person 对象的 run 方法
下断点可以看到:
<img src="./../assets/SwiftClassExposedToOCThenCalledBySwift1.png" style="zoom:30%" />
<img src="./../assets/SwiftClassExposedToOCThenCalledBySwift2.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftClassExposedToOCThenCalledBySwift1.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftClassExposedToOCThenCalledBySwift2.png" style="zoom:30%" />
分为2个阶段
1. 第一阶段:在 Swift 环境调用虽然暴露给 OC 的 Swift 对象方法,但因为没有和 OC 直接交互,所以走的是 Swift 虚函数表逻辑
@@ -330,7 +330,7 @@ Demo4: 在 Demo3 的基础上swift 方法内部调用 OC 对象方法
思考:想让 Swift 方法也走 OC 的 Runtime可以利用 **`dymanic`** 关键词修饰方法。如下:
<img src="./../assets/SwiftCallSwiftMethodUseDynamic.png" style="zoom:30%" />
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftCallSwiftMethodUseDynamic.png" style="zoom:30%" />
## dynamic 的作用