結構體與類的主要相同點有
1、定義存儲值的屬性
2、定義方法
3、定義下標以使用下標語法提供對其值的訪問
4、定義初始化器
5、使用extension來拓展功能
6、遵循協(xié)議來提供某種功能
主要的不同點有:
1、類有繼承的特性,而結構體沒有
2、類型轉(zhuǎn)換能夠在運行時檢查和解釋類實例的類型
3、類有析構函數(shù)用來釋放其分配的資源
4、引用計數(shù)允許對一個類實例有多個引用
5、類是引用類型而結構體是值類型
6、最直觀的區(qū)別:存儲的位置不同,一般情況值類型存儲在棧上引用類型存儲在堆上
引用類型:意味著一個類類型的變量并不直接存儲具體的實例對象,是對當前存儲具體實例內(nèi)存地址的引用
值類型:存儲的是具體的實例(或者說是具體的值)
struct LTStruct{
? ? var?age : Int
? ? var?name : String
}
var?s = LTStruct(age:20,name:"LT")
var?s1=s
通過上圖可知上面代碼中,s存儲LTStruct(age: 20, name: "LT") s1存儲LTStruct(age: 20, name: "LT")
指令p和po的區(qū)別:po只會輸出對應的值,而p則會返回值的類型以及命令結果的引用名
x/8g: 讀取內(nèi)存中的值(8g:8字節(jié)格式輸出)
內(nèi)存區(qū)域來一個基礎概念的認知,可見下圖:
Stack:局部變量和函數(shù)運行過程中的上下文
Heap: 存儲所有對象
Global:存儲全局變量,常量,代碼區(qū)
Segment & Section: Mach-O文件有多個段(Segment),每個段有不同的功能。然后每個段又分為很多小的Section
TEXT.text: 機器碼
TEXT.cstring: 硬編碼的字符串
TEXT.const:初始化過的常量
DATA.data:初始化過的可變的(靜態(tài)/全局)數(shù)據(jù)
DATA.bss:沒有初始化過的(靜態(tài)/全局)數(shù)據(jù)
DATA.common:沒有初始化過的符號聲明
DATA.const:沒有初始化過的常量
看下面例子:
struct LTStruct{
? ? var?age : Int = 20
? ? var?name : String = "LvTotti"
}
func?test(){
? ? var?t = LTStruct()
? ? print("end")
}
test()
其他條件不變,將struct修改成class的情況來看一下(代碼就不貼啦,修改上面即可)
frame variable -L ?xxx ?查看變量內(nèi)存地址
通過上面的demo對比,可知Struct存儲在棧區(qū),class在堆區(qū)
由于Struct在棧區(qū),而Class在堆區(qū),而堆區(qū)在使用過程中始終有一個find的過程,所以棧區(qū)的效率要高些,因此:優(yōu)先選擇Struct
可以通過github上的案例StructVsClassPerformance來直觀的測試結構體和類的時間分配
也可以查看蘋果官方文檔:Choosing Between Structures and Classes