一、結構體
在 Swift 標準庫中,絕大多數的公開類型都是結構體,而枚舉和類只占很小一部分
比如Bool、?Int、?Double、?String、?Array、?Dictionary等常見類型都是結構體
① struct Date {
② var year: Int
③ var month: Int
④ var day: Int ⑤ }
⑥ var date = Date(year: 2019, month: 6, day: 23)
?所有的結構體都有一個編譯器自動生成的初始化器( initializer ,初始化方法、構造器、構造方法)
在第⑥行調用的,可以傳入所有成員值,用以初始化所有成員(存儲屬性,Stored?Property)
二、結構體的初始化器
編譯器會根據情況,可能會為結構體生成多個初始化器,宗旨是:保證所有成員都有初始值
從這列子中可以看出,編譯器最終選擇什么初始化器和結構體原始定義有沒有賦默認值有關,編譯器選擇的初始化器會保證所有成員都有初始值;
三、這能編譯通過么
struct Point { var x: Int? var y: Int?
}
var p1 = Point(x: 10, y: 10)
var p2 = Point(y: 10)
var p3 = Point(x: 10)
var p4 = Point()
根據編譯器初使化餓的本質保證所有成員都有初始值
可選項都有個默認值nil
因此可以編譯通過
四、自定義初始化器
注:?一旦在定義結構體時自定義了初始化器,編譯器就不會再幫它自動生成其他初始化器
因此下邊的代碼后邊三句會撥錯
五、窺探初始化器的本質分析自定義初始化器和編譯器會我們生成的初始化器是一樣的么
第一句 編譯器的初始化qi
struct Point {
var x: Int = 0 var
y: Int = 0
}
var p = Point()第二句 自己的初始化qi
struct Point {
var x: Int
var y: Int
init() {
x = 0
y = 0}
}
var p = Point()
通過上面的匯編指令可以看出 編譯器自己調用的初始化qi和我們自己寫的初始化qi其實是一樣的
六、結構體占用內存大小
七、類
類的定義和結構體類似,但編譯器并沒有為類自動生成可以傳入成員值的初始化器
如何里面的x和y 沒有初使值,你調用無參會報錯,因為你的對象創建完成后,你里面的x和y成員沒有值是不安全的
如果類的所有成員都在定義的時候指定了初始值,編譯器會為類生成無參的初始化器;
成員的初始化是在這個初始化器中完成的
八、結構體與類的本質區別
結構體是值類型(枚舉也是值類型),類是引用類型(指針類型)
九、值類型 的深拷貝
值類型賦值給var、?let或者給函數傳參,是直接將所有內容拷貝一份
類似于對文件進行copy、?paste操作,產生了全新的文件副本。屬于深拷貝(deep?copy?)
p2.x = 11 p2.y = 22
// 請問p1.x和p1.y是多少?依然是原來的10和20
十 、值類型的賦值操作
在Swift標準庫中,為了提升性能,String、?Array、?Dictionary、?Set采取了Copy On Write的技術比如僅當有“寫”操作時,才會真正執行拷貝操作
對于標準庫值類型的賦值操作,?Swift 能確保最佳性能,所有沒必要為了保證最佳性能來避免賦值
?建議?:不需要修改的,盡量定義成let
為了提升性能,String、?Array、?Dictionary、?Set采取了Copy On Write的
var?s1 =?"Jack"?var?s2?=?s1
如有了這句才會有深拷貝,在之前沒有發生寫操作,直接就是淺拷貝
s2.append("_Rose")
print(s1) //?Jack
print(s2) //?Jack_Rose
十一、引用類型的賦值
s2.width =?11??s2.height =?22
// 請問s1.width和s1.height是多少 11 22?
十二、堆空間內存占用情況
class Point {
var x = 11
var test = true
var y = 22
}
var p = Point()
class_getInstanceSize(type(of: p)) // 40
class_getInstanceSize(Point.self) // 40內存地址的前16字節存的是p的地址,堆空間會檢查是不是16的倍數,對空間內存對其是48
根據內存對其 分配40哥字節,內存地址按8對其,實際用到的是16+8+8+3 =33
總結-匯編內存存值總結 5? 1.30
內存地址格式為:0x4bdc(%rip) ,一般是全局變量 ,全局區(數據段)
內存地址格式為:-0x78(%rbp) ,一般是局部變量 ,棧空間
內存地址格式為:0x10(%rax) ,一般是堆空間