swift中,class是引用類型,struct是值類型。值類型在傳遞和賦值時(shí)將進(jìn)行復(fù)制,而引用類型則只會(huì)使用引用對(duì)象的一個(gè)"指向"。所以他們兩者之間的區(qū)別就是兩個(gè)類型的區(qū)別。
class有這幾個(gè)功能struct沒有的:
- class可以繼承,這樣子類可以使用父類的特性和方法
- 類型轉(zhuǎn)換可以在runtime的時(shí)候檢查和解釋一個(gè)實(shí)例的類型
- 可以用deinit來釋放資源
- 一個(gè)類可以被多次引用
struct也有這樣幾個(gè)優(yōu)勢(shì):
- 結(jié)構(gòu)較小,適用于復(fù)制操作,相比于一個(gè)class的實(shí)例被多次引用更加安全。
- 無須擔(dān)心內(nèi)存memory leak或者多線程沖突問題
順便提一下,array在swift中是用struct實(shí)現(xiàn)的。Apple重寫過一次array,然后復(fù)制就是深度拷貝了。猜測(cè)復(fù)制是類似參照那樣,通過棧上指向堆上位置的指針來實(shí)現(xiàn)的。而對(duì)于它的復(fù)制操作,也是在相對(duì)空間較為寬裕的堆上來完成的,所以性能上還是不錯(cuò)的。
下面引用貓神OneV的博客:
var arr = [0,0,0]
var newArr = arr
arr[0] = 1
//Check arr and newArr
arr //[1, 0, 0]
newArr // before beta3:[1, 0, 0], after beta3:[0, 0, 0]
所以可以猜測(cè)其實(shí)在背后 Array和 Dictionary的行為并不是像其他 struct 那樣簡(jiǎn)單的在棧上分配,而是類似參照那樣,通過棧上指向堆上位置的指針來實(shí)現(xiàn)的。而對(duì)于它的復(fù)制操作,也是在相對(duì)空間較為寬裕的堆上來完成的。當(dāng)然,現(xiàn)在還無法(或者說很難)拿到最后的匯編碼,所以這只是一個(gè)猜測(cè)而已。
補(bǔ)充:
C語言中,struct與的class的區(qū)別:
struct只是作為一種復(fù)雜數(shù)據(jù)類型定義,不能用于面向?qū)ο缶幊獭?/p>
C++中,struct和class的區(qū)別:
對(duì)于成員訪問權(quán)限以及繼承方式,class中默認(rèn)的是private的,而struct中則是public的。class還可以用于表示模板類型,struct則不行。
原作者:故胤道長(zhǎng)
更多:iOS面試題合集