值类型、引用类型、堆内存、栈内存

138 阅读2分钟

iOS内存分为栈内存、堆内存。手机运行过程中,消耗内存的地方有:当前运行的App、系统操作内容、及其他应用的后台程序。

每个线程对应一个栈内存,栈内存很小,所以会有很多限制。

每个进程对应一个堆内存,堆内存的大小由计算机系统管理,运行的App决定不了堆内存的大小。比如:1GB RAM,可能分配到一个运行App的堆内存恐怕只有512M。

 需要理解下面这些概念,栈复制到堆,堆复制到栈,值传递,引用传递这些概念。

值类型、引用类型

Swift数据类型分为值类型、引用类型。

一般情况下,值类型数据存放在栈中,引用类型的数据存放在堆中。如果值类型是另一个引用类型的对象时,那么这个值类型存放在堆中。

值类型引用类型
Struct(结构体)Class(类)
Enum(枚举)闭包
Tuple(元组)
Int、Double、Bool(基础数据类型)
Array、String、Dictionary、Set(集合)

值传递

值传递:调用函数时,将实际参数复制一份到形参,传递到函数中,函数中对形参进行修改,不影响到实际参数。

例子:

let num = 15
func add(_ num1: Int) {
    let num1 = num1 + 5
    print("形式参数(num1)")
}
add(15)
print("实际参数(num)")

结果:

形式参数20

实际参数15

image.png  

引用传递

引用传递: 指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

class Person {
    var name: String = ""
}


let student = Person()
student.name = "Steven"


func changeNickname(student: Person) {
    student.name = "Tom"
}


changeNickname(student: student)
print("修改后的姓名(student.name)")

结果:

修改后的姓名Tom

image.png