Swift 類(lèi)和結(jié)構(gòu)體(3)

異變方法

值類(lèi)型屬性不能被自身的實(shí)例方法修改

struct Point {

? ? var x = 0.0

? ? var y = 0.0

? ? func test() {

? ? ? ? print(x)

? ? }

? ? mutating func moveBy(x deltaX: Double, y deltaY: Double) {

? ? ? ? x += deltaX

? ? ? ? y += deltaY

? ? }

}

mutating關(guān)鍵字解析

轉(zhuǎn)化為中間語(yǔ)言


shell 腳本執(zhí)行工程

shell 腳本語(yǔ)言

swiftc -emit-sil -Onone -target x86_64-apple-ios14.2-simulator -sdk $(xcrun --show-sdk-path --sdk iphonesimulator) ${SRCROOT}/swiftDemo2/ViewController.swift > ./ViewController.sil && open ViewController.sil

ViewController.sil

還原sīl的混編字符串

xcrun swift-demangle?s14ViewController5PointV4testyyF

// Point.test()

sil hidden @$s14ViewController5PointV4testyyF : $@convention(method) (Point) -> ()

debug_value %0 : $Point, let, name "self", argno 1 // id: %1

偽代碼 let self =?Point

// Point.moveBy(x:y:)

sil hidden @$s14ViewController5PointV6moveBy1x1yySd_SdtF : $@convention(method) (Double, Double, @inout Point) -> ()

debug_value_addr %2 : $*Point, var, name "self", argno 3 // id: %5

偽代碼 var self = &Point

mutating是將傳入的?self?被標(biāo)記為?inout?參數(shù)谷醉。

方法調(diào)度

class LGTeacher {

?? func teach() {

? ? ? print("teach")

?? }

}


teach方法匯編斷點(diǎn)示意圖

匯編基本指令

bl?跳轉(zhuǎn)到某地址(有返回)

blr?跳轉(zhuǎn)到某地址(無(wú)返回)

mov?x20, x0 將寄存到x0的值復(fù)制到寄存器20中

ldr x0,?[x1, x2] 將寄存器x1和寄存器x2的值相加作為地址,取該地址的值放入到寄存器x0中

teach方法匯編斷點(diǎn)分析

1. bl 0x100f3da28 返回一個(gè)LGTeacher實(shí)例對(duì)象

函數(shù)返回值是放在x0寄存器里面的催跪,x0存放LGTeacher實(shí)例對(duì)象

2. ldr x8, [x0] 將x0的第一個(gè)8字節(jié)缝驳,放入到x8中


ldr x8, [x0]執(zhí)行過(guò)

x8放入LGTeacher實(shí)例對(duì)象的 metadata

3. ldr x8, [x8, #0x50]?LGTeacher的metadata + 50

4. bl x8 執(zhí)行函數(shù)

teach函數(shù)的調(diào)用過(guò)程:找到?Metadata?席揽,確定函數(shù)地址(metadata + 偏移量)尼摹, 執(zhí)行函數(shù)

類(lèi)的方法是函數(shù)表調(diào)度

class LGTeacher {

?? func teach() {

? ? ? print("teach")

?? }

?? func teach1() {

? ? ? print("teach1")

?? }

?? func teach2() {

? ? ? print("teach2")

?? }

}

let t = LGTeacher()

? ? ? t.teach()

? ? ? t.teach1()

? ? ? t.teach2()


匯編示意圖

?teach跃惫,?teach1应又,?teach2 方法是連續(xù)的囚玫,猜想放在函數(shù)表中的

通過(guò)sil文件驗(yàn)證

sil_vtable LGTeacher {

? #LGTeacher.teach: (LGTeacher) -> () -> () : @$s14ViewController9LGTeacherC5teachyyF // LGTeacher.teach()

? #LGTeacher.teach1: (LGTeacher) -> () -> () : @$s14ViewController9LGTeacherC6teach1yyF // LGTeacher.teach1()

? #LGTeacher.teach2: (LGTeacher) -> () -> () : @$s14ViewController9LGTeacherC6teach2yyF // LGTeacher.teach2()

? #LGTeacher.init!allocator: (LGTeacher.Type) -> () -> LGTeacher : @$s14ViewController9LGTeacherCACycfC // LGTeacher.__allocating_init()

? #LGTeacher.deinit!deallocator: @$s14ViewController9LGTeacherCfD // LGTeacher.__deallocating_deinit

}

類(lèi)里面本身方法是函數(shù)表調(diào)度

擴(kuò)展方法是靜態(tài)分發(fā)

extension LGTeacher {

?? func teach3() {

? ? ? print("teach3")

?? }

}


匯編

直接調(diào)用內(nèi)存地址

方法調(diào)度總結(jié)


方法調(diào)度總結(jié)

影響函數(shù)派發(fā)方式

1. final: 添加了 final 關(guān)鍵字的函數(shù)無(wú)法被重寫(xiě)喧锦,使用靜態(tài)派發(fā),不會(huì)在 vtable 中出現(xiàn)抓督,且 對(duì) objc 運(yùn)行時(shí)不可見(jiàn)燃少。?

class LGTeacher {

?? final func teach() {

? ? ? print("teach")

?? }

?? func teach1() {

? ? ? print("teach1")

?? }

}


靜態(tài)派發(fā)

2. dynamic: 函數(shù)均可添加 dynamic 關(guān)鍵字,為非objc類(lèi)和值類(lèi)型的函數(shù)賦予動(dòng)態(tài)性铃在,但派發(fā) 方式還是函數(shù)表派發(fā)阵具。?

class LGTeacher {

?? dynamic func teach() {

? ? ? print("teach")

?? }? ?

}

extension LGTeacher {

?? @_dynamicReplacement(for: teach)

?? func teach3() {

? ? ? print("teach3")

?? }

}

3. @objc: 該關(guān)鍵字可以將Swift函數(shù)暴露給Objc運(yùn)行時(shí)碍遍,依舊是函數(shù)表派發(fā)。?

與oc 混編

class LGTeacher: NSObject {

?? @objc func teach() {

? ? ? print("teach")

?? }? ?

}

1.繼承NSObject

2. 加?@objc

查看橋接文件

1.

點(diǎn)擊

2. ->Generated Interface


swift的LGTeacher類(lèi)轉(zhuǎn)化oc

4. @objc + dynamic: 消息派發(fā)的方式 , 支持runtime,方法轉(zhuǎn)換

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阳液,一起剝皮案震驚了整個(gè)濱河市怕敬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帘皿,老刑警劉巖东跪,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鹰溜,居然都是意外死亡虽填,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)曹动,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)斋日,“玉大人,你說(shuō)我怎么就攤上這事墓陈《袷兀” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵贡必,是天一觀的道長(zhǎng)兔港。 經(jīng)常有香客問(wèn)我,道長(zhǎng)仔拟,這世上最難降的妖魔是什么押框? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮理逊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盒揉。我一直安慰自己晋被,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布刚盈。 她就那樣靜靜地躺著羡洛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藕漱。 梳的紋絲不亂的頭發(fā)上欲侮,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音肋联,去河邊找鬼威蕉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛橄仍,可吹牛的內(nèi)容都是我干的韧涨。 我是一名探鬼主播牍戚,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虑粥!你這毒婦竟也來(lái)了如孝?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤娩贷,失蹤者是張志新(化名)和其女友劉穎第晰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體彬祖,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年涧至,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腹躁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡南蓬,死狀恐怖纺非,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赘方,我是刑警寧澤烧颖,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站窄陡,受9級(jí)特大地震影響炕淮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜跳夭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一涂圆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧币叹,春花似錦润歉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至贩汉,卻和暖如春驱富,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匹舞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工褐鸥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人策菜。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓晶疼,卻偏偏與公主長(zhǎng)得像酒贬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翠霍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容