mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-24 20:00:37 +00:00
docs: image url
This commit is contained in:
@@ -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 的作用
|
||||
|
||||
Reference in New Issue
Block a user