本文主要介紹值類型程序員
爲了更好的理解值類型,首先了解內存分區模型,在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
,在其中看不到任何關於堆區的分配。結構體是值類型
,且結構體的地址就是第一個成員的內存地址。存儲值
。值傳遞
的過程,即至關於拷貝了一個副本,存入不一樣的內存空間,兩個空間彼此間並不共享狀態
。值傳遞
其實就是深拷貝
。