ios runtime

什么是runtime

OC是一門(mén)動(dòng)態(tài)語(yǔ)言,它是基于C語(yǔ)言的,它為C 添加了面向?qū)ο蟮奶匦酝⒘!K鼘⒑芏囔o態(tài)語(yǔ)言在編譯和鏈接時(shí)期做的事放到了 runtime 運(yùn)行時(shí)來(lái)處理.

runtime運(yùn)用

  1. 在程序運(yùn)行過(guò)程中,動(dòng)態(tài)的創(chuàng)建類红且,動(dòng)態(tài)添加坝茎、修改這個(gè)類的屬性和方法
  2. 遍歷一個(gè)類中所有的成員變量、屬性暇番、以及所有方法
  3. 消息傳遞景东、轉(zhuǎn)發(fā)

在OC中的NSObject對(duì)象定義

@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;

}

NSObject只有一個(gè)成員變量isa,它實(shí)際上是一個(gè)指向objc_class結(jié)構(gòu)體的指針

// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

// Represents an instance of a class.
struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;
  • 由此可見(jiàn)可以看到Class奔誓、id 都是指針
  • id是指向objc_object的一個(gè)指針
  • objc_object有個(gè)isa指向objc_class的一個(gè)指針
  • id和Class最后指向的都是objc_class這個(gè)結(jié)構(gòu)體

objc_class結(jié)構(gòu)體中的定義如下:

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class _Nullable super_class                              OBJC2_UNAVAILABLE;
    const char * _Nonnull name                               OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;

類就長(zhǎng)這樣子:

  • Class 也有一個(gè) isa 指針,指向其所屬的元類

  • super_class:指向其超類

  • name:是類名

  • version:是類的版本信息

  • info:是類的詳情

  • instance_size:是該類的實(shí)例對(duì)象的大小

  • ivars:指向該類的成員變量列表

  • methodLists:指向該類的實(shí)例方法列表,它將方法選擇器和方法實(shí)現(xiàn)地址聯(lián)系起來(lái)厨喂。methodLists 是指向 objc_method_list 的指針和措,也就是說(shuō)可以動(dòng)態(tài)修改 methodLists 的值來(lái)添加成員方法,這也是 Category 實(shí)現(xiàn)的原理蜕煌,同樣解釋了 Category 不能添加屬性的原因派阱。

  • cache:Runtime 系統(tǒng)會(huì)把被調(diào)用的方法存到 cache 中以便下次查找的時(shí)候效率更高

  • protocols:指向該類的協(xié)議列表

在runtime使用當(dāng)中,我們經(jīng)常需要用到的字段斜纪,它們的定義:

  • isa 和Class對(duì)象贫母,指向objc_class結(jié)構(gòu)體的指針
  • 類的實(shí)例對(duì)象的 isa 指向該類;該類的 isa 指向該類的 MetaClass
  • MetaCalss的isa對(duì)象指向RootMetaCalss
  • super_class Class對(duì)象指向父類對(duì)象
  • 如果該類的對(duì)象已經(jīng)是RootClass,那么這個(gè)super_class指向nil
  • MetaCalss的SuperClass指向父類的MetaCalss
  • MetaCalss是RootMetaCalss盒刚,那么該MetaClass的SuperClass指向該對(duì)象的RootClass


    底層原理.jpg
OC的方法調(diào)用 Runtime會(huì)轉(zhuǎn)化為消息發(fā)送腺劣,即 objc_msgSend(receiver, selector),即方法的調(diào)用者和方法選擇器因块,當(dāng)做參數(shù)傳遞.

方法的調(diào)用者會(huì)通過(guò) isa 指針來(lái)找到其所屬的類橘原,然后在 cache 或者 methodLists 中查找該方法,找得到就跳到對(duì)應(yīng)的方法去執(zhí)行涡上。
如果在類中沒(méi)有找到該方法趾断,則通過(guò) super_class 往上一級(jí)超類查找
類方法被存儲(chǔ)在元類中,Class 通過(guò) isa 指針即可找到其所屬的元類
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吩愧,一起剝皮案震驚了整個(gè)濱河市芋酌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雁佳,老刑警劉巖脐帝,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異甘穿,居然都是意外死亡腮恩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)温兼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秸滴,“玉大人,你說(shuō)我怎么就攤上這事募判〉春” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵届垫,是天一觀的道長(zhǎng)释液。 經(jīng)常有香客問(wèn)我,道長(zhǎng)装处,這世上最難降的妖魔是什么误债? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任浸船,我火速辦了婚禮,結(jié)果婚禮上寝蹈,老公的妹妹穿的比我還像新娘李命。我一直安慰自己,他們只是感情好箫老,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布封字。 她就那樣靜靜地躺著,像睡著了一般耍鬓。 火紅的嫁衣襯著肌膚如雪阔籽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天牲蜀,我揣著相機(jī)與錄音笆制,去河邊找鬼。 笑死各薇,一個(gè)胖子當(dāng)著我的面吹牛项贺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播峭判,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼开缎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了林螃?” 一聲冷哼從身側(cè)響起奕删,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疗认,沒(méi)想到半個(gè)月后完残,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡横漏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年谨设,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缎浇。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扎拣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出素跺,到底是詐尸還是另有隱情二蓝,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布指厌,位于F島的核電站刊愚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏踩验。R本人自食惡果不足惜鸥诽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一商玫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衙传,春花似錦决帖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扁远。三九已至俊鱼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畅买,已是汗流浹背并闲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谷羞,地道東北人帝火。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像湃缎,于是被迫代替她去往敵國(guó)和親犀填。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345