一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Swift - Swift方法調度之類的普通方法底層探究

Swift方法調度之類的普通方法底層探究

2021-12-24 14:17一眼萬年的星空 Swift

這篇文章主要介紹了Swift-方法調度-類的普通方法底層探究,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1. 類的普通方法調度

寫一個結構體和一個類,對比看看方法調用的方式:

// 結構體
struct PersonStruct {
  func changClassName() {}
}

let s = PersonStruct()
s.changClassName()

// 類
class PersonClass {
  func changClassName() {}
}

let c = PersonClass()
c.changClassName()

生成 SIL 代碼:

【1】結構體及類的 SIL 代碼:

Swift方法調度之類的普通方法底層探究

與結構體不同的是:為PersonClass類自動生成了一個反初始化方法。

【2】執行方法的 SIL 代碼:

Swift方法調度之類的普通方法底層探究

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

【3】還有一個不同點是,SIL 中為 PersonClass 自動生成了sil_vtable:

Swift方法調度之類的普通方法底層探究

由上面 SIL 代碼,我們可以看出,SIL 為類的方法創建了 sil_vtable,并在調用時,用class_method來修飾。這樣的類的方法調度,是Swift 中動態派發的一種方式,叫做函數派發。

這里由sil_vtable關鍵字聲明的就是函數表。函數表初始化的源碼如下:

Swift方法調度之類的普通方法底層探究

從源碼中看,函數表中的數據結構是一個數組,源碼是以遍歷的的方式去獲取函數表內的函數的,所以函數表是按順序存放類中可能是函數派發去執行的函數,但是不一定函數表內的函數都會被以函數派發的方式去調度。

 

2. OC 繼承鏈中的方法列表存儲結構

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

假設A類繼承B類,B類繼承C類,如下圖所示:

Swift方法調度之類的普通方法底層探究

 

3. Swift 繼承連中的函數表存儲結構

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

假設A類繼承B類,B類繼承C類,如下圖所示:

Swift方法調度之類的普通方法底層探究

代碼驗證一下:
Swift

class PersonClass: NSObject {
  override init() {
      super.init()
      @objc func changClassName7() {}
      dynamic func changClassName8() {}
  }
}

class PersonClassSub: PersonClass {
  func runSub() {}
  // 重寫的函數,在函數表中會指定為子類中的函數
  override func changClassName7() {}
}

class PersonClassSubSub: PersonClassSub {
  func runSubSub() {}
}

Swift方法調度之類的普通方法底層探究

到這里,證實2件事情:

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

到此這篇關于Swift-方法調度-類的普通方法底層探究的文章就介紹到這了,更多相關Swift-方法調度內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/mysweetAngleBaby/p/15490151.html

延伸 · 閱讀

精彩推薦
  • SwiftSwift教程之基礎數據類型詳解

    Swift教程之基礎數據類型詳解

    這篇文章主要介紹了Swift教程之基礎數據類型詳解,本文詳細講解了Swift中的基本數據類型和基本語法,例如常量和變量、注釋、分號、整數、數值類型轉換等...

    Swift教程網5162020-12-18
  • Swiftswift where與匹配模式的實例詳解

    swift where與匹配模式的實例詳解

    這篇文章主要介紹了swift where與匹配模式的實例詳解的相關資料,這里附有簡單的示例代碼,講的比較清楚,需要的朋友可以參考下...

    追到夢的魔術師14382021-01-06
  • SwiftSwift的74個常用內置函數介紹

    Swift的74個常用內置函數介紹

    這篇文章主要介紹了Swift的74個常用內置函數介紹,這篇文章列舉出了所有的Swift庫函數,內置函數是指無需引入任何模塊即可以直接使用的函數,需要的朋友可...

    Swift教程網5802020-12-19
  • SwiftSwift實現多個TableView側滑與切換效果

    Swift實現多個TableView側滑與切換效果

    這篇文章主要為大家詳細介紹了Swift實現多個TableView側滑與切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    乞力馬扎羅的雪雪5822021-01-08
  • Swiftmac git xcrun error active developer path 錯誤

    mac git xcrun error active developer path 錯誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環境時,出現了錯誤(mac git xcrun error active developer path)的解決辦法,希望對大家有所幫助...

    Swift教程網2232020-12-16
  • SwiftSwift使用CollectionView實現廣告欄滑動效果

    Swift使用CollectionView實現廣告欄滑動效果

    這篇文章主要為大家詳細介紹了Swift使用CollectionView實現廣告欄滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Stevin的技術博客12372021-01-13
  • SwiftSwift中轉義閉包示例詳解

    Swift中轉義閉包示例詳解

    在Swift 中的閉包類似于結構塊,并可以在任何地方調用,下面這篇文章主要給大家介紹了關于Swift中轉義閉包的相關資料,需要的朋友可以參考下...

    小小小_小朋友11412021-12-26
  • SwiftSwift能代替Objective-C嗎?

    Swift能代替Objective-C嗎?

    這是我在網上上看到的答案,復制粘貼過來和大家分享一下,因為我和很多人一樣很關心Swift的出現對Mac開發的影響和對Objective-C的影響。...

    Swift教程網4412020-12-16
主站蜘蛛池模板: 精品国产自在天天线2019 | 日本黄大片影院一区二区 | 91麻豆精品国产91久久久 | 欧美日韩精 | 国产成人综合亚洲亚洲欧美 | 日本人护士免费xxxx视频 | 精品一区二区三区色花堂 | 偷偷操不一样 | 欧美黑人一级 | tube69中国露脸 | yjsp妖精视频在线观看免费 | 日不卡| 成人二区 | 10个免费货源网站 | wwwav视频 | 免费网站看v片在线成人国产系列 | 亚洲成人第一页 | 日本三级在线观看免费 | 欧美午夜性春猛交bbb | 富士av105| 青柠影院在线观看免费完整版1 | 青草午夜精品视频在线观看 | 日本69sex护士www | 狠狠色婷婷狠狠狠亚洲综合 | 九九精品99久久久香蕉 | 果冻传媒在线视频播放观看 | 天天天天天天天操 | 日本伦理动漫在线观看 | 精品国产乱码久久久久久免费 | 亚洲精品中文 | 日本一本草久p | 男人边吃奶边做好爽视频免费 | www.午夜剧场 | 男人晚上适合偷偷看的污污 | 人禽l交视频在线播放 视频 | 免费一级毛片在线播放放视频 | 国产一区二区三区在线看 | 国产区一二三四区2021 | 日本福利网 | 2020韩国r级理论片在线观看 | 92福利网|