本文主要介绍值类型程序员
为了更好的理解值类型,首先了解内存分区模型,在iOS中,内存主要分为 栈区
、 堆区
、 全局区
、 常量区
、 代码区
五大区域。以下图所示markdown
如图所示spa
->
低地址,向下延伸,由系统
自动管理,是一片连续的
内存地址。->
高地址,向上延伸,由程序员
管理,堆空间结构相似于链表
,是不连续
的。堆栈溢出
,能够理解为栈区与堆区边界碰撞的状况。值
。传递
了一个副本
,也就是所谓的深拷贝
。func test() {
var age = 18
var age2 = age
age = 30
age2 = 45
print("age=\(age),age2=\(age2)")
}
test()
复制代码
断点查看age的栈区地址与内存状况code
po withUnsafePointer(to: &age){print($0)}
x/8g 0x00007ffeefbff410
一样查看age2的栈区地址与内存状况 orm
能够看出,age2
的赋值至关于将age
中的值拿出来,赋值给了age2
。其中age
与 age2
的地址 相差了8字节
,从这里能够说明栈空间是连续
的、且是从高到低
的。内存
定义一个结构体,并进行分析开发
struct PDTeacher {
var age : Int = 16
var age2: Int = 20
}
var t = PDTeacher()
print("end")
复制代码
po t
,可知,打印出来t就是值,没有任何与地址有关的信息t1
和t
之间是值传递
,即t1和t是不一样的内存空间
,是直接将t
中的值拷贝
至t1
中。修改t1中的值,是修改的t1
的内存空间,是不会影响t
的内存空间的。一样的,咱们也能够经过分析SIL来验证结构体是值类型it
SIL
文件中,咱们查看结构体的初始化方法,能够发现只有init
,而没有malloc
,在其中看不到任何关于堆区的分配。结构体是值类型
,且结构体的地址就是第一个成员的内存地址。存储值
。值传递
的过程,即至关于拷贝了一个副本,存入不一样的内存空间,两个空间彼此间并不共享状态
。值传递
其实就是深拷贝
。