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

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

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
主站蜘蛛池模板: chanelpreston欧美网站 | 国产成人手机在线好好热 | 男人的私人影院 | 好男人在线观看免费高清2019韩剧 | 福利片免费一区二区三区 | 国产片在线看 | 91国内精品久久久久怡红院 | 疯狂激吻添下边小说 | 91sao国产在线观看 | 青草青视频 | 免费永久观看美女视频网站网址 | 97操| 精品综合久久久久久8888 | 精品国产免费第一区二区三区日韩 | 欧美一区二区三区gg高清影视 | 欧美在线一级视频 | 久久精品动漫网一区二区 | 久久久精品免费免费直播 | 99只有精品| 99热这里只有精品国产在热久久 | 久久精品在现线观看免费15 | 亚洲黑人巨大videos0 | 美女鸡 | 日韩免费一级毛片 | 香港论理午夜电影网 | chinesefree普通对话| 日本一区二区三区久久精品 | 国产精品视频色拍拍 | 国产成人精品一区二区 | 99久久伊人一区二区yy5099 | 精品一区二区三区免费观看 | 亚洲精品综合一二三区在线 | 久久久久久免费高清电影 | 欧美 亚洲 一区 | 肉文np高h| 亚洲 欧美 国产 日韩 字幕 | 欧美 国产 日韩 第一页 | 欧美精品黑人巨大在线播放 | 2012中文字幕中字视频 | 欧美成人精品第一区二区三区 | 成人性生交小说免费看 |