最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift方法調(diào)度之類的普通方法底層探究

 更新時(shí)間:2021年11月01日 11:01:26   作者:一眼萬年的星空  
這篇文章主要介紹了Swift-方法調(diào)度-類的普通方法底層探究,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1. 類的普通方法調(diào)度

寫一個(gè)結(jié)構(gòu)體和一個(gè)類,對(duì)比看看方法調(diào)用的方式:

// 結(jié)構(gòu)體
struct PersonStruct {
    func changClassName() {}
}
 
let s = PersonStruct()
s.changClassName()
 
// 類
class PersonClass {
    func changClassName() {}
}
 
let c = PersonClass()
c.changClassName()

生成 SIL 代碼:

【1】結(jié)構(gòu)體及類的 SIL 代碼:

與結(jié)構(gòu)體不同的是:為PersonClass類自動(dòng)生成了一個(gè)反初始化方法。

【2】執(zhí)行方法的 SIL 代碼:

在調(diào)用的方式中,可以看到類的方法,不是由function_ref修飾,而是class_method修飾。

【3】還有一個(gè)不同點(diǎn)是,SIL 中為 PersonClass 自動(dòng)生成了sil_vtable:

由上面 SIL 代碼,我們可以看出,SIL 為類的方法創(chuàng)建了 sil_vtable,并在調(diào)用時(shí),用class_method來修飾。這樣的類的方法調(diào)度,是Swift 中動(dòng)態(tài)派發(fā)的一種方式,叫做函數(shù)派發(fā)。

這里由sil_vtable關(guān)鍵字聲明的就是函數(shù)表。函數(shù)表初始化的源碼如下:

從源碼中看,函數(shù)表中的數(shù)據(jù)結(jié)構(gòu)是一個(gè)數(shù)組,源碼是以遍歷的的方式去獲取函數(shù)表內(nèi)的函數(shù)的,所以函數(shù)表是按順序存放類中可能是函數(shù)派發(fā)去執(zhí)行的函數(shù),但是不一定函數(shù)表內(nèi)的函數(shù)都會(huì)被以函數(shù)派發(fā)的方式去調(diào)度。

2. OC 繼承鏈中的方法列表存儲(chǔ)結(jié)構(gòu)

我們知道OC 中的方法是消息派發(fā)的方式。 每個(gè)對(duì)象中都有一個(gè) isa 指針,指向自己的類。類中存放著該類實(shí)現(xiàn)的方法列表。本類方法列表中存放著本類實(shí)現(xiàn)的方法及父類方法列表的指針。在消息派發(fā)時(shí),會(huì)先查找本來的方法列表,如果沒找到,再去查找父類的方法列表,以此類推,來尋找方法的實(shí)現(xiàn)。

假設(shè)A類繼承B類,B類繼承C類,如下圖所示:

3. Swift 繼承連中的函數(shù)表存儲(chǔ)結(jié)構(gòu)

Swift 類中函數(shù)派發(fā)與消息派發(fā)類似, 所有類也會(huì)維護(hù)一個(gè)自己的函數(shù)表,不同的是所有未被復(fù)寫的父類所實(shí)現(xiàn)的函數(shù)地址都會(huì)拷貝在這個(gè)表中, 而不是由一個(gè)指向父類方法表的指針替代,被重寫的函數(shù),在函數(shù)表中會(huì)指定為子類中的函數(shù)。由于少了一步指針尋址步驟, 在派發(fā)效率上要比基于消息的派發(fā)高效。

假設(shè)A類繼承B類,B類繼承C類,如下圖所示:

代碼驗(yàn)證一下:
Swift

class PersonClass: NSObject {
    override init() {
        super.init()
        @objc func changClassName7() {}
        dynamic func changClassName8() {}
    }
}
 
class PersonClassSub: PersonClass {
    func runSub() {}
    // 重寫的函數(shù),在函數(shù)表中會(huì)指定為子類中的函數(shù)
    override func changClassName7() {}
}
 
class PersonClassSubSub: PersonClassSub {
    func runSubSub() {}
}

到這里,證實(shí)2件事情:

  • Swift的函數(shù)表是按順序存放的
  • 在類的繼承關(guān)系中,函數(shù)表中存放所有的方法,由上到下,依次排列,先是父類的方法,再是子類的方法。

到此這篇關(guān)于Swift-方法調(diào)度-類的普通方法底層探究的文章就介紹到這了,更多相關(guān)Swift-方法調(diào)度內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Swift算法實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)字的方法示例

    Swift算法實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)字的方法示例

    最近學(xué)完了swift想著實(shí)踐下,就通過一些簡(jiǎn)單的算法進(jìn)行學(xué)習(xí)研究,下面這篇文章主要介紹了Swift算法實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)字的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Swift編程中用以管理內(nèi)存的自動(dòng)引用計(jì)數(shù)詳解

    Swift編程中用以管理內(nèi)存的自動(dòng)引用計(jì)數(shù)詳解

    這篇文章主要介紹了Swift編程中用以管理內(nèi)存的自動(dòng)引用計(jì)數(shù)詳解,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • Swift實(shí)現(xiàn)無限輪播效果

    Swift實(shí)現(xiàn)無限輪播效果

    這篇文章主要為大家詳細(xì)介紹了Swift無限輪播效果實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Swift開發(fā)中switch語句值綁定模式

    Swift開發(fā)中switch語句值綁定模式

    本文給大家分享Swift開發(fā)中switch語句值綁定模式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下
    2016-12-12
  • 深入理解Swift中的變量與常量

    深入理解Swift中的變量與常量

    本文主要是介紹Swift中最常用的常量和變量,將從“變量常量的定義”、"如何聲明變量常量"、“變量和常量的命名”,"變量常量的本質(zhì)區(qū)別"四個(gè)方面入手,重點(diǎn)介紹變量和常量的使用以及區(qū)別,希望大家在閱讀完本文后都可以熟練使用它們。有需要的朋友們下面來一起學(xué)習(xí)吧。
    2017-01-01
  • Swift中動(dòng)態(tài)調(diào)用實(shí)例方法介紹

    Swift中動(dòng)態(tài)調(diào)用實(shí)例方法介紹

    這篇文章主要介紹了Swift中動(dòng)態(tài)調(diào)用實(shí)例方法介紹,在Swift中有一類很有意思的寫法,可以讓我們不直接使用實(shí)例來調(diào)用這個(gè)實(shí)例上的方法,而是通過類型取出這個(gè)類型的某個(gè)實(shí)例方法的簽名,然后再通過傳遞實(shí)例來拿到實(shí)際需要調(diào)用的方法,需要的朋友可以參考下
    2015-01-01
  • Swift中排序算法的簡(jiǎn)單取舍詳解

    Swift中排序算法的簡(jiǎn)單取舍詳解

    對(duì)于排序算法, 通常簡(jiǎn)單的, 為大家所熟知的有, 選擇排序, 冒泡排序, 快速排序, 當(dāng)然還有哈希, 桶排序之類的, 本文僅比較最為常見的選擇, 冒泡和快排,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-03-03
  • Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法

    Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法

    這篇文章主要介紹了關(guān)于在Swift中將UILabel數(shù)字顏色設(shè)置為紅色的方法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • 用Swift編寫自動(dòng)錄音器

    用Swift編寫自動(dòng)錄音器

    這篇文章主要介紹了用Swift編寫自動(dòng)錄音器,有需要的朋友可以借鑒下
    2015-07-07
  • Swift如何優(yōu)雅的進(jìn)行解包

    Swift如何優(yōu)雅的進(jìn)行解包

    這篇文章主要介紹了Swift優(yōu)雅的進(jìn)行解包,對(duì)swift感興趣的同學(xué),可以參考下
    2021-04-04

最新評(píng)論

阳泉市| 梓潼县| 陇川县| 龙岩市| 湘阴县| 吉首市| 南昌市| 榆社县| 开远市| 攀枝花市| 都江堰市| 霍山县| 杭锦旗| 宕昌县| 黄平县| 固镇县| 丰镇市| 绥江县| 青田县| 手游| 乌兰县| 施甸县| 邵武市| 和顺县| 全州县| 弋阳县| 墨玉县| 扬州市| 曲沃县| 阳信县| 锦州市| 永州市| 新巴尔虎右旗| 中山市| 曲阳县| 凤阳县| 巴南区| 商水县| 揭阳市| 五原县| 阿荣旗|