From 3f8b541e95e1c71971f978276576c26059748ef3 Mon Sep 17 00:00:00 2001 From: jiulinxiri Date: Fri, 7 Jan 2022 11:01:43 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 08 类.playground/Resources/README.md | 118 +++++++++++++++++- .../UserInterfaceState.xcuserstate | Bin 14997 -> 14373 bytes 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/08 类.playground/Resources/README.md b/08 类.playground/Resources/README.md index 9466520..cfa2ea8 100644 --- a/08 类.playground/Resources/README.md +++ b/08 类.playground/Resources/README.md @@ -21,13 +21,127 @@ func test() { test()方法在内存中的存储结构 -![jiulinxiri_20220106223910.png](https://vip1.loli.io/2022/01/06/5nON1A42PkVFijr.png) +jiulinxiri_20220106223910.png + * point结构体是值类型,在内存中存储的是值 * size类是引用类型,在内存中存储的是Size对象的内存地址 -![jiulinxiri_20220106224431.png](https://vip1.loli.io/2022/01/06/TRshqXCfrilFnQu.png) +jiulinxiri_20220106224431.png + * 前边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 +} +``` + +栈空间的存储结构如下所示 + +jiulinxiri_20220107093427 + +> 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 +} +``` + +内存中的存储结构如下图所示 + +jiulinxiri_20220107102828 + +#### 引用类型的赋值操作 + +```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) +``` + +内存中的结构如下图所示 + +jiulinxiri_20220107104836 + + + + + + + + + + + + + + + + + + + +> 对象的堆空间申请过程 +> +> 在Swift中,创建类的实例对象,要向堆空间申请内存,大概流程如下 +> +> 1. Class.__allocating_init()_ +> 2. libswiftCore.dylib:_swift_allocObject_ +> 3. libswiftCore.dylib:swift_slowAlloc +> 4. libsystem_malloc.dylib:malloc +> +> diff --git a/08 类.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate b/08 类.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate index 7e00ff4fad3e09cc91f055ac0ab379647eab925e..5225e2cede151100a01ec78cd958cb093a7bc6f7 100644 GIT binary patch delta 4410 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 aS(C)1#H1=o&hmXRKzWM~%G-*2lKbD<%U}5b delta 4678 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