mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-25 04:17:17 +00:00
docs: image url
This commit is contained in:
@@ -159,10 +159,10 @@ Dog.speak() // Animal speak dog is bark
|
||||
|
||||
但如果将 `Animal` 方法的 `class` 改为 `static`,就无法 `override` 了
|
||||
|
||||
<img src="./../assets/SwiftCannotOverrideStaticMethod.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftCannotOverrideStaticMethod.png" style="zoom:25%">
|
||||
|
||||
|
||||
<img src="./../assets/SwiftCannotOverrideStaticMethod2.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftCannotOverrideStaticMethod2.png" style="zoom:25%">
|
||||
|
||||
- 如果父类的方法是被 class 修饰的,子类继承后重写时,可以将 class 改为 static。
|
||||
- 虽然子类可以将父类方法的 class 改为 static。但影响的是当前子类的子类,无法再重写方法了。
|
||||
@@ -294,9 +294,9 @@ Animal sleep
|
||||
|
||||
在 `animal.speak()` 处加断点,可以看到
|
||||
|
||||
<img src="./../assets/SwiftClassPointerDemo1.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftClassPointerDemo1.png" style="zoom:25%">
|
||||
|
||||
<img src="./../assets/SwiftClassPointerDemo3.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftClassPointerDemo3.png" style="zoom:25%">
|
||||
|
||||
解释:
|
||||
|
||||
@@ -310,7 +310,7 @@ Animal sleep
|
||||
|
||||
画了张图,也就是说 `rax` 中存放了 Dog 对象内存中的前8个字节,也就是下图的最右侧
|
||||
|
||||
<img src="./../assets/SwiftClassPointerDemo2.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftClassPointerDemo2.png" style="zoom:25%">
|
||||
|
||||
|
||||
|
||||
@@ -415,7 +415,7 @@ print(num) // Optional(12)
|
||||
|
||||
1. 不允许同时定义参数标签、参数个数、参数类型相同的可失败初始化器和非可失败初始化器。因为在外部调用的时候,不知道到底是使用哪个初始化方法。编译器会报错 `Invalid redeclaration of 'init(_:)'`
|
||||
|
||||
<img src="./../assets/SwiftCanFailedInit.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftCanFailedInit.png" style="zoom:25%">
|
||||
|
||||
2. 可以用 `init!` 来定义隐式解包的可失败初始化器
|
||||
|
||||
@@ -453,7 +453,7 @@ print(num) // Optional(12)
|
||||
}
|
||||
```
|
||||
|
||||
<img src="./../assets/SwiftCanFailedInit2.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftCanFailedInit2.png" style="zoom:25%">
|
||||
|
||||
且前面的写法比较危险,假设第一个 `init?` 返回 `nil`,第二个 `convenience init()` 去对 nil 强制解包,则会 crash
|
||||
|
||||
@@ -732,7 +732,7 @@ var personType: Person.Type = Person.self
|
||||
|
||||
|
||||
|
||||
<img src="./../assets/SwiftClassMetaDataTypeDemo1.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftClassMetaDataTypeDemo1.png" style="zoom:25%">
|
||||
|
||||
在第二行代码下断点,可以看到关键的汇编是第8行和第12行:
|
||||
|
||||
@@ -750,7 +750,7 @@ var personType: Person.Type = Person.self
|
||||
|
||||
- `metadata` 结构类似下图右侧
|
||||
|
||||
<img src="./../assets/SwiftClassPointerDemo2.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftClassPointerDemo2.png" style="zoom:25%">
|
||||
|
||||
|
||||
|
||||
@@ -951,7 +951,7 @@ class Person: Runable {
|
||||
|
||||
就像上面[多态实现的原理](#target-anchor)这里讲到的一样
|
||||
|
||||
<img src="./../assets/SwiftClassPointerDemo2.png" style="zoom:25%">
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/SwiftClassPointerDemo2.png" style="zoom:25%">
|
||||
|
||||
查表是一种简单、易实现、性能可预知的方式。然而,这种派发方式比起直接派发来说,还是慢了一点(从字节码的角度来看,多了两次读和一次跳转。由此带来了性能损耗)。另一个慢的原因在于编译器可能会由于函数内执行的任务,导致无法优化(如果函数带有副作用的话)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user