This commit is contained in:
2022-01-07 11:01:43 +08:00
parent 9c736ae9ef
commit 3f8b541e95
2 changed files with 116 additions and 2 deletions

View File

@@ -21,13 +21,127 @@ func test() {
test()方法在内存中的存储结构
![jiulinxiri_20220106223910.png](https://vip1.loli.io/2022/01/06/5nON1A42PkVFijr.png)
<img src="https://vip1.loli.io/2022/01/06/5nON1A42PkVFijr.png" alt="jiulinxiri_20220106223910.png" style="zoom: 50%;" />
* point结构体是值类型在内存中存储的是值
* size类是引用类型在内存中存储的是Size对象的内存地址
![jiulinxiri_20220106224431.png](https://vip1.loli.io/2022/01/06/TRshqXCfrilFnQu.png)
<img src="https://vip1.loli.io/2022/01/06/TRshqXCfrilFnQu.png" alt="jiulinxiri_20220106224431.png" style="zoom:50%;" />
* 前边16个字节存储的是指向类型信息以及引用计数
* 后边的16个字节存储的是成员变量
### 值类型
值类型赋值给`var`,`let` 或者函数参数传参,是直接将所有的内容拷贝一份。
> 类似于对文件进行copy、paste操作产生了全新的文件副本。属于深拷贝deep copy
```swift
struct Point {
var x: Int
var y: Int
}
func test() {
var p1 = Point(x: 10, y: 20)
var p2 = p1
}
```
栈空间的存储结构如下所示
<img src="/Users/jiulinxiri/Library/Application Support/CleanShot/media/media_KC0xPvSPh2/jiulinxiri_20220107093427.png" alt="jiulinxiri_20220107093427" style="zoom:50%;" />
> p1和p2成员变量之间的赋值操作没有任何影响
#### 值类型的赋值操作
```swift
var a1 = [1, 2, 3]
var a2 = a1
a2.append(4)
a1[0] = 2
print(a1) // [2, 2, 3]
print(a2) // [1, 2, 3, 4]
```
在Swift标准库中为了提升性能String、Array、Dictionary、Set采取了Copy On Write的技术
* 比如仅当有“写”操作时,才会真正执行拷贝操作
不需要修改的,尽量定义成 `let`
#### 引用类型
引用赋值给 `var`,`let`或者给函数传参,是将内存地址拷贝一份。
> 类似于制作文件替身快捷方式、链接指向同一文件属于浅拷贝shallow copy
```swift
class Size {
var width: Int
var height: Int
init(width: Int, height: Int) {
self.width = width
self.height = height
}
}
func test() {
var s1 = Size(width: 10, height: 20)
var s2 = s1
}
```
内存中的存储结构如下图所示
<img src="/Users/jiulinxiri/Library/Application Support/CleanShot/media/media_0v4F5R7v07/jiulinxiri_20220107102828.png" alt="jiulinxiri_20220107102828" style="zoom:50%;" />
#### 引用类型的赋值操作
```swift
class Size {
var width: Int
var height: Int
init(width: Int, height: Int) {
self.width = width
self.height = height
}
}
var s1 = Size(width: 10, height: 20)
s1 = Size(width: 11, height: 22)
```
内存中的结构如下图所示
<img src="/Users/jiulinxiri/Library/Application Support/CleanShot/media/media_OZ2b6Ma2Vn/jiulinxiri_20220107104836.png" alt="jiulinxiri_20220107104836" style="zoom:50%;" />
> 对象的堆空间申请过程
>
> 在Swift中创建类的实例对象要向堆空间申请内存大概流程如下
>
> 1. Class.__allocating_init()_
> 2. libswiftCore.dylib_swift_allocObject_
> 3. libswiftCore.dylibswift_slowAlloc
> 4. libsystem_malloc.dylibmalloc
>
>