Runtime原理初探

Runtime簡介

對于C語言,函數(shù)的調(diào)用在編譯的時候會決定調(diào)用哪個函數(shù),如果調(diào)用未實現(xiàn)的函數(shù)就會報錯。對于OC語言,屬于動態(tài)調(diào)用過程,在編譯的時候并不能決定真正調(diào)用哪個函數(shù),只有在真正運行的時候才會根據(jù)函數(shù)的名稱找到對應(yīng)的函數(shù)來調(diào)用。在編譯階段,OC可以調(diào)用任何函數(shù),即使這個函數(shù)并未實現(xiàn),只要聲明過就不會報錯。

Object-c運行時版本

在現(xiàn)行版本中,最顯著的新特性就是實例變量是"健壯“(non-fragile)的:

  • 在早期版本中,如果您改變類中實例變量的布局,您必須重新編譯該類的所有子類。
  • 在現(xiàn)行版本中,如果您改變類中實例變量的布局,您無需重新編譯該類的任何子類。
  • 此外,現(xiàn)行版本支持聲明property的synthesis屬性

平臺

  • iPhone 程序和 Mac OS X v10.5 及以后的系統(tǒng)中的 64 位程序使用的都是 - Objective-C 運行時系統(tǒng)的現(xiàn)行版 本。
  • 其它情況(Mac OS X 系統(tǒng)中的 32 位程序)使用的是早期版本。

和運行時交互

和運行時交互主要有種方式:

  • 大部分情況下runtime在后臺運行,我們只需編寫oc代碼就可以
  • 通過 Foundation 框架中類 NSObject 的方法


    一些主要方法.png
  • 通過直接調(diào)用運行時系統(tǒng)的函數(shù)(Runtime API)

消息機制

OC方法調(diào)用實際是objc_msgSend函數(shù)調(diào)用,本質(zhì)是消息機制:消息接收體(類),消息名稱(方法),還可帶參數(shù)。
如果想看是函數(shù)是如何調(diào)用的,可以用下指令會生成對應(yīng)的.cpp 文件,里面就能找到OC方法對應(yīng)的C方法

clang -rewrite-objc xxxx.m

oobjc_msgSend執(zhí)行過程大致可以分為三個過程:

小插曲:
SEL : 類成員方法的指針,但不同于C語言中的函數(shù)指針,函數(shù)指針直接保存了方法的地址,但SEL只是方法編號。
IMP:一個函數(shù)指針,保存了方法的地址
方法編號SEL最后還是要通過Dispatch table表尋找到對應(yīng)的IMP,IMP就是一個函數(shù)指針,然后執(zhí)行這個方法

  • 消息發(fā)送
1、消息接收者(Class)判斷消息(func)是否為空,如果為nil就return
2、如果不為空通過isa指針找到類,從類里面緩存里面去找imp,
3、如果找到了,直接返回直接執(zhí)行,如果沒有找到就從類的方法列表去找
4、如果找到了就把方法填充到緩存里面然后把imp進行返回。
5、如果沒有找到嘗試從父類緩存和方法列表里面去找,就一直循環(huán)遍歷到根類(方法執(zhí)行一次之后緩存里面就有了)
  • 動態(tài)方法解析
    有時候,您需要動態(tài)地提供一個方法的實現(xiàn)。您可以通過實現(xiàn) resolveInstanceMethod:resolveClassMethod:來動態(tài)地實現(xiàn)給定選標 的對象方法或者類方法。

  • 消息轉(zhuǎn)發(fā)

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

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,650評論 1 32
  • runtime 運行時語言,實現(xiàn)Object-C的C語言庫,將OC轉(zhuǎn)換成C進行編譯的過渡者。 作為一門動態(tài)編程語言...
    夜雨聲煩_閱讀 627評論 0 0
  • 一、Runtime簡介 Runtime簡稱運行時。OC就是運行時機制,也就是在運行時候的一些機制,其中最主要的是消...
    林安530閱讀 1,112評論 0 2
  • 消息發(fā)送和轉(zhuǎn)發(fā)流程可以概括為:消息發(fā)送(Messaging)是 Runtime 通過 selector 快速查找 ...
    lylaut閱讀 1,989評論 2 3
  • 如果想了解Runtime的實際應(yīng)用請看Runtime全面剖析之簡單使用 一:Runtime簡介二: Runtime...
    iYeso閱讀 851評論 0 2

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