iOS 類(class)和結(jié)構(gòu)體(struct)有什么區(qū)別?

Swift 中,類是引用類型,結(jié)構(gòu)體是值類型。值類型在傳遞和賦值時將進行復(fù)制,而引用類型則只會使用引用對象的一個"指向"。所以他們兩者之間的區(qū)別就是兩個類型的區(qū)別。

舉個簡單的例子,代碼如下

class Temperature {
  var value: Float = 37.0
}

class Person {
  var temp: Temperature?

  func sick() {
    temp?.value = 41.0
  }
}

let A = Person()
let B = Person()
let temp = Temperature()

A.temp = temp
B.temp = temp

A.sick()
上面這段代碼,由于 Temperature 是 class ,為引用類型,故 A 的 temp 和 B 的 temp指向同一個對象。A 的 temp修改了,B 的 temp 也隨之修改。這樣 A 和 B 的 temp 的值都被改成了41.0。如果將 Temperature 改為 struct,為值類型,則 A 的 temp 修改不影響 B 的 temp。

內(nèi)存中,引用類型諸如類是在堆(heap)上,而值類型諸如結(jié)構(gòu)體實在棧(stack)上進行存儲和操作。相比于棧上的操作,堆上的操作更加復(fù)雜耗時,所以蘋果官方推薦使用結(jié)構(gòu)體,這樣可以提高 App 運行的效率。

class有這幾個功能struct沒有的:

class可以繼承,這樣子類可以使用父類的特性和方法
類型轉(zhuǎn)換可以在runtime的時候檢查和解釋一個實例的類型
可以用deinit來釋放資源
一個類可以被多次引用
struct也有這樣幾個優(yōu)勢:

結(jié)構(gòu)較小,適用于復(fù)制操作,相比于一個class的實例被多次引用更加安全。
無須擔(dān)心內(nèi)存memory leak或者多線程沖突問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容