詳解Runtime運(yùn)行時(shí)機(jī)制

  • 引言
  • 簡(jiǎn)介
  • 與Runtime交互
  • Runtime術(shù)語(yǔ)
  • 消息
  • 動(dòng)態(tài)方法解析
  • 消息轉(zhuǎn)發(fā)
  • 健壯的實(shí)例變量(Non Fragile ivars)
  • Objective-C Associated Objects
  • Method Swizzling
  • 總結(jié)

引言

曾經(jīng)覺(jué)得Objc特別方便上手,面對(duì)Cocoa中大量的API,只知道簡(jiǎn)單的查文檔和調(diào)用。還記得初學(xué)Objective-C時(shí)把[receiver message]當(dāng)成簡(jiǎn)單的方法調(diào)用,而無(wú)視了"發(fā)送消息"這句話的深刻含義。其實(shí)[receiver message]會(huì)被編譯器轉(zhuǎn)化為:

objc_msgSend(receiver, selector)

如果消息含有參數(shù),則為:

objc_msgSend(receiver,selector,arg1,arg2,...)

如果消息的接受者能夠找到對(duì)應(yīng)的selector,那么就相當(dāng)于直接執(zhí)行了接受者這個(gè)對(duì)象的特定方法;否則,消息要么被轉(zhuǎn)發(fā),或是臨時(shí)向接收者動(dòng)態(tài)添加這個(gè)selector對(duì)應(yīng)的實(shí)現(xiàn)內(nèi)容,要么就干脆玩完崩潰掉。
現(xiàn)在可以看出[receiver message]真的不是一個(gè)簡(jiǎn)簡(jiǎn)單單的方法調(diào)用。因?yàn)檫@只是在編譯階段確定了要向接受者發(fā)送message這條消息,而receive將要如何響應(yīng)這條消息,那就要看運(yùn)行時(shí)發(fā)生的情況來(lái)決定了。
Objective-C 的Runtime鑄就了它動(dòng)態(tài)語(yǔ)言的特性,這些深層次的知識(shí)雖然平時(shí)寫(xiě)代碼用的少一些,但是卻是每個(gè)Objc程序員要了解的。

簡(jiǎn)介

因?yàn)镺bjc是一門(mén)動(dòng)態(tài)語(yǔ)言,所以它總是想辦法把一些決定工作從編譯連接推遲到運(yùn)行時(shí)。也就是說(shuō)只有編譯器是不夠的,還需要一個(gè)運(yùn)行時(shí)系統(tǒng)(runtime system)來(lái)執(zhí)行編譯后的代碼。這就是Objective-C Runtime系統(tǒng)存在的意義,它是整個(gè)Objc運(yùn)行框架的一塊基石。

Runtime其實(shí)有兩個(gè)版本:"modern"和"legacy"。我們現(xiàn)在用的Objective-C2.0采用的是現(xiàn)行(Modern)版的Runtime系統(tǒng),只能運(yùn)行在iOS和OS X 10.5之后的64位程序中。而OS X較老的32位程序仍采用Objective-C 1中的(早期)Legacy版本的Runtime系統(tǒng)。這兩個(gè)版本最大的區(qū)別在于當(dāng)你更改一個(gè)類(lèi)的實(shí)例變量的布局時(shí),在早期版本中你需要重新編譯它的子類(lèi),而現(xiàn)行版就不需要。

Runtime基本是用C和匯編寫(xiě)的,可見(jiàn)蘋(píng)果為了動(dòng)態(tài)系統(tǒng)的高效而作出的努力。你可以在這里下到蘋(píng)果維護(hù)的開(kāi)源代碼。蘋(píng)果和GNU各自維護(hù)一個(gè)開(kāi)源的runtime版本,這兩個(gè)版本之間都在努力的保持一致。

與Runtime交互

Objc從三種不同的層級(jí)上與Runtime系統(tǒng)進(jìn)行交互,分別是通過(guò)Objective-C源代碼,通過(guò)Foundation框架的NSObject類(lèi)定義的方法,通過(guò)對(duì)runtime函數(shù)的直接調(diào)用。

Objective-C源代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容