主要的不同點有
類有繼承的特性传货,而結(jié)構(gòu)體沒有
類型轉(zhuǎn)換使您能夠在運(yùn)行時檢查和解釋實例的類型
類有析構(gòu)函數(shù)用來釋放其分配的資源
引用計數(shù)允許對一個類實例有多個引用
在類里面可以通過deinit析構(gòu)函數(shù)把一些對象進(jìn)行釋放掉的挥下。
下面的引用類型,也就意味著一個類類型的變量并不直接存儲具體的實例對象贬养,是對當(dāng)前存儲具體實例內(nèi)存地址的引用。我們通過withUnsafePointer去打印其內(nèi)存地址沮尿,發(fā)現(xiàn)to和t1是相鄰的侮叮,其地址相差8字節(jié)的。
swift中有引用類型帽驯,就是值類型龟再,最典型的就是struct,結(jié)構(gòu)體的定義也非常簡單尼变,相比較類類型的變量中存儲的是地址利凑,那么值類型存儲的就是具體的實例(或者說具體的值)。
下面代碼是用struct去定義的嫌术,當(dāng)把t1=t哀澈,打印后其都是值,值相等度气,如果這個時候改變t1.age=20割按,只會改變t1不會對t產(chǎn)生影響,因為是值傳遞磷籍。
另外引用類型和值類型還有一個最直觀的區(qū)別就是存儲的位置不同:一般情況值類型存儲的在棧上哲虾,引用類型存儲在堆上。
當(dāng)我們在結(jié)構(gòu)體里存放個一個實例對象P择示,age和name存放在棧上的,這個時候的實例對象P也存放在棧上的晒旅,P里面存放的內(nèi)存地址是在堆上開辟的栅盲,t這個結(jié)構(gòu)體變量還是存放在堆上的,所以結(jié)構(gòu)體里存放個實例對象是不改變結(jié)構(gòu)體存放的位置的废恋。
通過兩個實例來打印struct和class所用的時間谈秫,發(fā)現(xiàn)struct明顯要快扒寄。class用了7.5s,而struct只用了5.57s拟烫。
類的初始化器
需要注意的一點是:當(dāng)前的類編譯器默認(rèn)不會自動提供成員初始化器该编,但是對于結(jié)構(gòu)體來說編譯器會提供默認(rèn)的初始化方法(前提是我們自己沒有指定指定初始化值)
下面的是提供默認(rèn)的值,18硕淑,“l(fā)g”课竣,這個初始化器就是默認(rèn)的init(),因為賦值了置媳。
Swift中創(chuàng)建類和結(jié)構(gòu)體的實例時必須為所有的存儲屬性設(shè)置一個合適的初始值于樟。所以類LGPerson必須要提供對應(yīng)的指定初始化器,同時我們也可以為當(dāng)前的類提供便捷初始化器(注意:便捷初始化器必須從相同的類里調(diào)用另一個初始化器)
下面加了convenience就是便捷的意思拇囊,便捷初始化器迂曲。沒有convenience開頭的就是默認(rèn)初始化器。在convenience中我們需要調(diào)用init寥袭,這個是為了保持內(nèi)存安全路捧,進(jìn)行初始化其值,防止為空传黄。如果把convenience里的self.age和self.name放在self.init前面的話就會報錯杰扫。
使用初始化器需要注意點:
1)指定初始化器必須保證在向上委托給父類初始化器之前,其所在類引入的所有屬性都要初始化完成尝江。
2)指定初始化器必須先向上委托父類初始化器涉波,然后才能為繼承的屬性設(shè)置新值。如果不這樣做炭序,指定初始化器賦予的新值將被父類中的初始化器所覆蓋啤覆。
3)便捷初始化器必須先委托同類中的其它初始化器,然后再為任意屬性賦新值(包括同類里定義的屬性)惭聂。如果沒這么做窗声,便捷構(gòu)初始化器賦予的新值將被自己類中其它指定初始化器所覆蓋。
4)初始化器在第一階段初始化完成之前辜纲,不能調(diào)用任何實例方法笨觅,不能讀取任何實例屬性的值,也不能引用self作為值耕腾。
可失敗初始化器
這個也非常好理解见剩,也就意味著當(dāng)前因為參數(shù)的不合法或者外部條件的不滿足,存在初始化失敗的情況扫俺。這種Swift中可失敗初始化器寫return nil語句苍苞,來表明可失敗初始化器在何種情況下會觸發(fā)初始化失敗。
必要初始化器
在類的初始化器前添加required修飾符來表明所有該類的子類都必須實現(xiàn)該初始化器
swift中初始化代碼分析
我們在蘋果的官網(wǎng)下載swift源碼,然后定位到HeapObject.cpp里羹呵,會發(fā)現(xiàn)其底層代碼調(diào)用的一個邏輯骂际。
swift對象內(nèi)存分配:
__allocating_init --> swift_allocObject --> _swift_allocObject --> swift_slowAlloc --> Malloc
Swift對象的內(nèi)存結(jié)構(gòu)HeapObject,有兩個屬性:一個是Metadata,一個是RefCount冈欢,默認(rèn)占用16字節(jié)大小歉铝。OC里對象object_objectC里是isa指針等
Swift里類的結(jié)構(gòu)探索
swift里類的內(nèi)存結(jié)構(gòu)如下: