iOS Runtime

runtime數(shù)據(jù)結(jié)構(gòu)

  1. id = objc_object
    isa_t
    關(guān)于isa操作相關(guān)
    弱引用相關(guān)
    關(guān)聯(lián)對(duì)象相關(guān)
    內(nèi)存管理相關(guān)

2.Class = objc_class 繼承自objc_Object,是一個(gè)(類)對(duì)象
Class superClass
cache_t cache(方法緩存)
class_data_bits_t (類的變量,屬性,和方法)

isa指針

共用體isa_t(64位或者32位置,0或者1的數(shù)字)
指針型isa,64位的0或者1,isa的值代表Class的地址
非指型isa,是指的是部分的值代表Class的地址

isa方向

  • id對(duì)象,指向類對(duì)象
  • 類對(duì)象,指向元類對(duì)象
    如果我們調(diào)用一個(gè)方法,如果是實(shí)例對(duì)象是通過它的isa指針去他的類對(duì)象中查找;如果是類對(duì)象則是通過isa指針去他的元類對(duì)象中去查找。

cache_t

用于快速查找方法執(zhí)行的函數(shù)
是可增量擴(kuò)展的哈希表結(jié)構(gòu)
是計(jì)算機(jī)局部性原理的最佳應(yīng)用(把調(diào)用頻次更高的放在緩存池中)
是由bucket_t組成,里面有key(對(duì)應(yīng)SEL)和IMP(無類型的函數(shù)指針)

class_data_bits_t

是對(duì)class_rw_t的封裝。
class_rw_t代表了類相關(guān)的讀寫信息(類添加的分類、協(xié)議等),對(duì)class_ro_t 的封裝,代表累的相關(guān)的只讀信息。

  • class_rw_t的組成
    class_ro_t
    protocols
    properties
    methods

  • class_ro_t的數(shù)據(jù)結(jié)構(gòu)(類原始定義,不是后來添加的)
    name(可以反射獲得)
    ivars(成員變量)
    properties(屬性)
    protocols(協(xié)議)
    methodLists

  • methods
    函數(shù)的四要素
    名稱 - SEL name
    返回值 - const char*types
    參數(shù) - …
    函數(shù)體 - IMP imp

  • Tpye Encodings 機(jī)制,和const char*types相關(guān)
    不可變的字符指針
    返回值 參數(shù)1 參數(shù)2 … 參數(shù)n

  • (void)aMethod <=> V@:
    V 返回值void
    @ 對(duì)象 id
    : SEL

類對(duì)象和元類對(duì)象

類對(duì)象和元類什么關(guān)系和區(qū)別是什么?

  • 類對(duì)象存儲(chǔ)實(shí)例方法列表等信息
  • 元類對(duì)象存儲(chǔ)類方法列表等信息
    實(shí)例對(duì)象可以通過isa指針找到他的類對(duì)象,訪問實(shí)例方法列表等信息。
    類對(duì)象可以通過isa指針訪問元類對(duì)象找到類方法列表等信息。
    類對(duì)象和元類的對(duì)象都是繼承自objc_class數(shù)據(jù)結(jié)構(gòu),所以都是有isa指針。
    元類對(duì)象的isa指針都指向根元類對(duì)象,根元類對(duì)象的isa指針指向自己。
    而根元類對(duì)象的父類指針指向根類對(duì)象,當(dāng)元類對(duì)象沒有這個(gè)方法的時(shí)候會(huì)去根類對(duì)象中找實(shí)例方法有沒有同名的方法。

總結(jié):調(diào)用的實(shí)例方法,會(huì)根據(jù)isa指針去找到類對(duì)象,在類對(duì)象中去遍歷方法實(shí)現(xiàn),沒有查找的話順著supperclass這真去找。
調(diào)用的類方法,會(huì)根據(jù)isa指針去找到元類對(duì)象,在元類對(duì)象中去遍歷方法實(shí)現(xiàn),沒有查找的話順著supperclass這真去找一直找到跟元類對(duì)象。

消息傳遞

supper是編譯關(guān)鍵字,super的數(shù)據(jù)結(jié)構(gòu)指的是當(dāng)前對(duì)象。所以supper的接收者是當(dāng)前對(duì)象。

·

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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