Swift類與結構體

結構體與類的主要相同點有

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ū)域來一個基礎概念的認知,可見下圖:

內(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()

frame variable輸出struct

其他條件不變,將struct修改成class的情況來看一下(代碼就不貼啦,修改上面即可)

frame variable 輸出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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 一、類與結構體 1.1 結構體 結構體:結構體和類十分相似,既可以定義屬性,又可以定義方法,但其不像類一樣具有繼承...
    常在士心閱讀 518評論 0 1
  • 一.初始類與結構體 了解類與結構體的異同點 結構體和類的主要共同點有: 定義存儲值的屬性 定義方法 定義下標以使用...
    劉國強閱讀 467評論 0 1
  • 一、類與結構體的對比 1.在 Swift 中類和結構體有很多共同之處: 定義屬性用來存儲值; 定義方法用于提供功能...
    大白菜s閱讀 849評論 0 1
  • 在面向過程的語言中,要想實現(xiàn)類似類的功能只能借助結構體,其實從OC源碼也能看出來,類的組成本就是復雜的結構體實現(xiàn)的...
    如風如花不如你閱讀 8,226評論 2 6
  • 類與結構體方法上的區(qū)別 一. 異變方法 Swift中類(class)和結構體(struct)都能定義方法.但是有一...
    劉國強閱讀 688評論 0 1