1.靜態(tài)派發(fā)機制同時支持值類型和引用類型
然而,動態(tài)派發(fā)機制僅支持引用類型,比如Class,簡而言之:對于動態(tài)性或者動態(tài)派發(fā)筋蓖,我們需要用到繼承特性,而這是值類型不支持的
首先全面了解一下退敦,由4種派發(fā)機制粘咖,而不是兩種(靜態(tài)和動態(tài))
1.內(nèi)聯(lián)(inline)(最快)
2.靜態(tài)派發(fā)(Static Dispatch)
3.函數(shù)表派發(fā)(Virtual Dispatch)
4.動態(tài)派發(fā)(Dynamic Dispatch)(最慢)
由編譯器決定應該使用哪種派發(fā)技術(shù),當然有限選擇內(nèi)聯(lián)函數(shù)侈百,然后按需選擇
靜態(tài)派發(fā)VS動態(tài)派發(fā)
Objective-C默認支持動態(tài)派發(fā)瓮下,中華和鐘派發(fā)技術(shù)以多態(tài)的形式為開發(fā)人員提供了靈活性,比如子類可以重寫父類的方法钝域,這很棒唱捣,然而這也是需要付出代價的
動態(tài)派發(fā)以一定量的運行時開銷為代價,提高了語言的靈活性网梢,這意味著,在動態(tài)派發(fā)機制下赂毯,對于每個方法的調(diào)用战虏,編譯器必須在方法列表中查找執(zhí)行方法的實現(xiàn),編譯器需要判斷調(diào)用方党涕,是選擇父類的實現(xiàn)烦感,還是子類的實現(xiàn),而且由于所有對象的內(nèi)存都是在運行時分配的膛堤,因此編譯只能在運行時執(zhí)行檢查手趣,
而靜態(tài)調(diào)用,則沒有這個問題,在編譯期的時候绿渣,編譯器就知道要為某個方法調(diào)用某種實現(xiàn)朝群,因此,編譯器可以執(zhí)行某些優(yōu)化中符,甚至在可能的情況下姜胖,可以將某些代碼轉(zhuǎn)成inline函數(shù),從而使整體執(zhí)行速度異车砩ⅲ快
2.如何在swift中實現(xiàn)動態(tài)派發(fā)和靜態(tài)派發(fā)
->要實現(xiàn)動態(tài)派發(fā)右莱,我們可以使用繼承,重寫父類的方法档插,另外我們可以使用dynamic關(guān)鍵字慢蜓,并且需要在@objc關(guān)鍵字前面加上關(guān)鍵字,以便將方法公開給OC runtime使用
->要實現(xiàn)靜態(tài)派發(fā)郭膛,我們可以使用final和static關(guān)鍵字晨抡,保證不會被覆蓋