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