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:
@@ -122,11 +122,11 @@ getDiameter () {
|
||||
|
||||
然后通过汇编来窥探下,在 `circle.diameter = 22` 处加断点,可以看到本质上调用的就是 `setter` 方法,`setter` 内部的实现就不一一窥探了
|
||||
|
||||
<img src="./../assets/SwiftStorePropertySetterDemo1.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftStorePropertySetterDemo1.png" style="zoom:25%">
|
||||
|
||||
然后断点继续,在 `let diameter = circle.diameter` 处加断点,可以看到调用了 getter 方法
|
||||
|
||||
<img src="./../assets/SwiftStorePropertySetterDemo2.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftStorePropertySetterDemo2.png" style="zoom:25%">
|
||||
|
||||
计算属性的本质就是方法,看上去是属性,但是不占用结构体的内存。而是独立在代码段中,所以只占用1个 Int 即8个字节的大小。
|
||||
|
||||
@@ -300,7 +300,7 @@ let season = Season.summer
|
||||
print(season.rawValue)
|
||||
```
|
||||
|
||||
<img src="./../assets/SwiftEnumRawValueExplore.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftEnumRawValueExplore.png" style="zoom:25%">
|
||||
|
||||
通过汇编 `SwiftDemo.Season.rawValue.getter` 可以看到,在调用 **`enum` 的 `rawvalue` 的时候本质是通过计算属性调用 `getter` 来实现的**。
|
||||
|
||||
@@ -431,11 +431,11 @@ width is 20, side is 4, girth is 80
|
||||
|
||||
|
||||
|
||||
<img src="./../assets/SwiftInoutExploreDemo1.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftInoutExploreDemo1.png" style="zoom:25%">
|
||||
|
||||
然后看到17行的关键代码,LLDB 输入 `si`,可以看到在第6行 `movq $0x14, (%rdi)`,将16进制的 `0x14` 也就是20,移动到指定的内存地址 `rdi` 上
|
||||
|
||||
<img src="./../assets/SwiftInoutExploreDemo2.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftInoutExploreDemo2.png" style="zoom:25%">
|
||||
|
||||
因为 `struct` 结构体内存布局中,成员变量在内存中是连续存储的。所以 `struct `的地址也就是 `struct` 中第一个成员变量 `width` 的地址。
|
||||
|
||||
@@ -462,7 +462,7 @@ width is 5, side is 4, girth is 20
|
||||
|
||||
在 `changeValue(&shape.girth)` 处下断点,查看汇编
|
||||
|
||||
<img src="./../assets/SwiftInoutExploreDemo3.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftInoutExploreDemo3.png" style="zoom:25%">
|
||||
|
||||
核心思路:方法参数用 `inout`修饰,则传递的是引用(内存地址)。
|
||||
|
||||
@@ -476,7 +476,7 @@ width is 5, side is 4, girth is 20
|
||||
|
||||
- LLDB 输入 `si` 查看 changeValue 内部。可以看到第6行 `movq $0x14, (%rdi)` 直接将20赋值给 `rdi`
|
||||
|
||||
<img src="./../assets/SwiftInoutExploreDemo4.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftInoutExploreDemo4.png" style="zoom:25%">
|
||||
|
||||
|
||||
|
||||
@@ -511,7 +511,7 @@ width is 10, side is 20, girth is 200
|
||||
|
||||
在 `changeValue(&shape.side)` 处添加断点,查看汇编
|
||||
|
||||
<img src="./../assets/SwiftInoutExploreDemo5.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftInoutExploreDemo5.png" style="zoom:25%">
|
||||
|
||||
分析:
|
||||
|
||||
@@ -529,7 +529,7 @@ width is 10, side is 20, girth is 200
|
||||
|
||||
- LLDB 输入 `si`,可以看到 `setter` 方法内部,调用了 `willSet`、`didSet`
|
||||
|
||||
<img src="./../assets/SwiftInoutExploreDemo6.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftInoutExploreDemo6.png" style="zoom:25%">
|
||||
|
||||
|
||||
|
||||
@@ -605,7 +605,7 @@ width is 10, side is 20, girth is 200
|
||||
|
||||
Demo1:
|
||||
|
||||
<img src="./../assets/SwiftTypePropertyDemo1.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftTypePropertyDemo1.png" style="zoom:25%">
|
||||
|
||||
`movq $0xa, 0x86d1(%rip) ` num1 的地址为: `rip + 0x86d1 = 0x100003b0f + 0x86d1 = 0x10000C1E0 `
|
||||
|
||||
@@ -619,7 +619,7 @@ Demo1:
|
||||
|
||||
Demo2
|
||||
|
||||
<img src="./../assets/SwiftTypePropertyDemo2.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftTypePropertyDemo2.png" style="zoom:25%">
|
||||
|
||||
`movq $0xa, 0x8b65(%rip)` num1 的内存为 `rip + 0x8b65 = 0x1000037c3 + 0x8b65 = 0x10000C328 `
|
||||
|
||||
@@ -650,17 +650,17 @@ Manager.count = 11
|
||||
- 抽象内存访问隐藏实际存储位置(可能位于不同段或延迟分配)
|
||||
- 支持属性观察(didSet)通过封装访问点插入回调逻辑
|
||||
|
||||
<img src="./../assets/SwiftTypeProperytyDispatchOnce1.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftTypeProperytyDispatchOnce1.png" style="zoom:30%" />
|
||||
|
||||
lldb 输入 si 查看具体实现
|
||||
|
||||
<img src="./../assets/SwiftTypeProperytyDispatchOnce2.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftTypeProperytyDispatchOnce2.png" style="zoom:30%" />
|
||||
|
||||
可以看到底层调用了 `swift_once` 函数,函数传递了2个参数, rsi 存储 dispatch_once 的 block 参数,rdi 存储了 onceToken
|
||||
|
||||
继续敲 si 可以看到底层调用的就是 GCD 的 `dispatch_once` 函数。
|
||||
|
||||
<img src="./../assets/SwiftTypeProperytyDispatchOnce3.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftTypeProperytyDispatchOnce3.png" style="zoom:30%" />
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user