Swift进阶(四)--- 值类型 & 引用类型

2020-12-31  本文已影响0人  Jax_YD

值类型:类似于本地的Excel,修改的内容只有自己知道。
引用类型:类似于在线的表格,修改的内容大家都知道。
在我们剖析值类型引用类型之前,我们向来回顾一下iOS的内存分区。

内存分区.png

接下里我们详细探讨一下值类型引用类型

值类型

我们来看下面的例子:

func text() {
    var size = 10
    
    var size_2 = size
    
    size = 20
    
    print("第一次改变")
    print("size=\(size), size_2=\(size_2)")
    
    siz_2 = 30
    print("第二次改变")
    print("size=\(size), size_2=\(size_2)")
}

text()
/************** 输出结果 **************/
第一次改变
size=20, size_2=10
第二次改变
size=20, size_2=30
Program ended with exit code: 0

我们接着往下看,现在我们用LLDB来查看一下sizesize_2的内存结构

image.png

我们再来看一张图:


image1.png

总结:值类型的特点:
1、值类型存储在
2、地址中存储的就是
3、值类型的传递过程中会产生新的副本,是深拷贝
4、值类型赋值给varlet或者给函数传参,是直接将所有内容拷贝一份

注意:

结构体

struct Date {
    var year: Int
    var month: Int
    var day: Int
}
var date = Date(year: 2020, month: 12, day: 17)
struct Date {
    var year: Int
    var month: Int

    init() {
        year = 2020
        month = 12
    }
}
var date = Date()
struct Date {
    var year: Int = 2020
    var month: Int = 12
}
var date = Date()

1、首先我们来看第一个结构体(进行断点调试):


image5.png image6.png

2、我们再来看一下第二个结构体(进行断点调试):


image7.png image8.png image9.png
struct Date {
    var year = 2020
    var month = 12
    var Good = true
}
print(MemoryLayout<Date>.size)
print(MemoryLayout<Date>.stride)
print((MemoryLayout<Date>.alignment))
/********** 输出结果 ************/
17
24
8

总结:
1、结构体值类型,且结构体的地址是第一个成员的内存地址(可通过LLDB查看)
2、结构体默认初始化器自定义初始化器没有任何区别
3、结构体一旦在定义结构体时自定义了初始化器,编译器就不会再帮它自动生成其他初始化器
4、所有的结构体都有一个编译器自动生成的初始化器
5、编译器会根据情况,可能会为结构体生成多个初始化器,宗旨是:保证所有成员都有初始值

引用类型

eg:

class Man {
    var age = 30
    var height: Int?
    
    
    init(_ age: Int) {
        self.age = age
    }
    
    init(height: Int) {
        self.height = height
    }
    
    init(_ age: Int, _ height: Int) {
        self.age = age
        self.height = height
    }
}

let M1 = Man.init(20)
let M2 = Man.init(height: 180)
let M3 = Man.init(18, 190)

为什么类是引用类型?

eg:

class Man {
    var age = 30
    var height: Int?
}
let M1 = Man.init()

下面我们断点调试一下M1

image.png

接下来我们思考一个问题
\color{red}{如果结构体内存放类对象,会是什么情况?}
通过上文我们知道:

总结:
1、引用类型
2、类对象里面存储的是地址,类对象之间的赋值属于地址传递(浅拷贝)
3、值类型引用类型互相包含的情况下,并不会改变各自的存储形式。

上一篇下一篇

猜你喜欢

热点阅读