iOS Runtime基礎(chǔ)概念與數(shù)據(jù)結(jié)構(gòu)

Objective-C是從C發(fā)展出來的語言谤碳,只是在語言層面上加了些關(guān)鍵字和語法旷档。真正讓Objective-C強(qiáng)大的是它的Runtime運(yùn)行時(shí),讓OC在C語言的基礎(chǔ)上增加了面向?qū)ο蠛蛣?dòng)態(tài)特性。

Q1:OC與C語言有什么不同琐谤?
C是靜態(tài)語言檐蚜、面向過程語言
OC是動(dòng)態(tài)語言魄懂、面向?qū)ο笳Z言
因此,OC更加強(qiáng)大闯第。

Q2:C是靜態(tài)語言市栗,OC是從C語言發(fā)展出來的,OC如何實(shí)現(xiàn)動(dòng)態(tài)的咳短?
Runtime(運(yùn)行時(shí))

Q3:什么是Runtime填帽?

  1. Runtime是為了實(shí)現(xiàn) OC 面向?qū)ο蟆?dòng)態(tài)機(jī)制的一個(gè)庫(kù)咙好。
  2. 由 C 和匯編語言寫成篡腌。

Q4:Runtime干什么?
OC代碼并不是直接編譯為目標(biāo)語言勾效,OC代碼首先需要編譯器轉(zhuǎn)化為純C語言嘹悼,然后編譯和匯編成目標(biāo)代碼叛甫。
其中,從OC到C語言的轉(zhuǎn)化杨伙,就需要運(yùn)行時(shí)庫(kù)Runtime其监。這個(gè)運(yùn)行時(shí)庫(kù)(Runtime)用來動(dòng)態(tài)得創(chuàng)建類和對(duì)象、進(jìn)行消息傳遞和轉(zhuǎn)發(fā)缀台。

  1. 將 OC 面向?qū)ο蟮念愞D(zhuǎn)變?yōu)?C 語言面向過程的結(jié)構(gòu)體
  2. 將 OC 函數(shù)調(diào)用轉(zhuǎn)化為消息傳遞和轉(zhuǎn)發(fā)
  3. 消息傳遞和轉(zhuǎn)發(fā)的過程棠赛,最終找到合適的C函數(shù)執(zhí)行的過程。

Q5:如何實(shí)現(xiàn)Runtime膛腐?
Runtime核心是消息分發(fā)機(jī)制

Runtime一些核心結(jié)構(gòu)體定義

1. 對(duì)象定義:

struct objc_object {
    Class isa;
} *id;

每個(gè)OC對(duì)象的首個(gè)成員是一個(gè)指向Class的指針isa(如果子類中定義了其他對(duì)象睛约,那么追加在后面)。

2. Class定義:

typedef struct objc_class *Class;

Class就是一個(gè)指針哲身,指向一個(gè)objc_class結(jié)構(gòu)體辩涝。

3. objc_class結(jié)構(gòu)體的定義:

struct objc_class {
    Class isa;                 //指針:指向當(dāng)前類的元類(類的類)
    Class super_class;         //指針:指向當(dāng)前類的父類
    const char *name;
    long version;
    long info;
    long instance_size;
    struct objc_ivar_list *ivars;
    struct objc_method_list ** methodLists;     //方法列表
    struct objc_cache *cache;                 //cache的方法
    struct objc_protocol_list *protocols;
};
  • objc_class定義了類的信息,存放了類的元數(shù)據(jù)metadata勘天,其中包括類的元類怔揩、父類、Name脯丝、變量商膊、方法列表、方法cache(用于加速方法查詢)宠进。
  • objc_class類中首個(gè)變量也是一個(gè)isa指針晕拆,說明Class也是一個(gè)對(duì)象(類也是一個(gè)對(duì)象)。
  • objc_class的isa指針指向的當(dāng)前類的類(元類metaclass)材蹬,保存了當(dāng)前類對(duì)象的元數(shù)據(jù)实幕,類方法定義此處。
  • 每個(gè)類僅有一個(gè)元類metaclass堤器,每個(gè)元類僅有一個(gè)metaclass對(duì)象(就是這個(gè)類Class)
對(duì)象昆庇、類、元類之間的關(guān)系
  1. 每個(gè)類對(duì)象中持有了一個(gè)isa指針闸溃,指向這個(gè)對(duì)象的類對(duì)象(類對(duì)象保存了該類的成員方法)整吆;
  2. 類對(duì)象中的super_class指針指向了這個(gè)類的父類,isa指向該類的元類(元類保存了該類的類方法)圈暗;
  3. 元類中的super_class指針指向元類的父類掂为。

4. 選擇器Selector

// An opaque type that represents a method selector.
typedef struct objc_selector *SEL;

選擇器Selector用于標(biāo)識(shí)一個(gè)方法。從上面代碼中我們可以看出员串,SEL是一個(gè)指向objc_selector結(jié)構(gòu)體的指針勇哗。

struct objc_selector {
    char *name;                       
    char *types;                     
};

objc_selector是一個(gè)結(jié)構(gòu)體,用于標(biāo)識(shí)一個(gè)方法寸齐。用于在類的HashTable找到對(duì)應(yīng)的函數(shù)欲诺。

5. IMP

typedef void (*IMP)(void /* id, SEL, ... */ ); 

IMP就是一個(gè)函數(shù)指針抄谐,參數(shù)為(id, SEL, ...) 指向函數(shù)所在內(nèi)存地址

6. 方法列表

struct objc_method {
    SEL _Nonnull method_name ;
    char * method_types;
    IMP _Nonnull method_imp ;
};

typedef struct objc_method *Method;

struct objc_method_list {
    struct objc_method_list *bsolete;
    int method_count;
    /* variable length structure */
    struct objc_method method_list[1];
};

objc_method結(jié)構(gòu)體保存方法的信息,其中包含SEL和IMP扰法,SEL用來標(biāo)識(shí)一個(gè)方法蛹含,IMP用來指向方法的內(nèi)存地址。

7. 方法緩存

struct objc_cache {
    unsigned int mask /* total = mask + 1 */  ;
    unsigned int occupied;
    Method _Nullable buckets[1];
};

當(dāng) objc_msgSend() 通過一個(gè)類來查找一個(gè)選擇器SEL時(shí)塞颁,它首先會(huì)搜索類緩存浦箱,用于快速查找Method,如果沒找到再遍歷objc_method_list祠锣。

8. 變量列表

struct objc_ivar {
    char * ivar_name;
    char * ivar_type;
    int ivar_offset ;
};

struct objc_ivar_list {
    int ivar_count;
    /* variable length structure */
    struct objc_ivar ivar_list[1];
};

9. 協(xié)議列表

struct objc_protocol_list {
    struct objc_protocol_list * next;
    long count;
    __unsafe_unretained Protocol * list[1];
};

@interface Protocol : NSObject
@end

Protocol也是一個(gè)對(duì)象酷窥。

從上面可以看出

  1. Class、SEL伴网、Method都是指向特定結(jié)構(gòu)體的指針蓬推。
  2. IMP是函數(shù)指針。

小結(jié):本文簡(jiǎn)單介紹了iOS Runtime的一些基本概念澡腾,并分析了runtime的源碼中這些概念的實(shí)現(xiàn)沸伏。
簡(jiǎn)單來說OC在C語言的基礎(chǔ)上定義了一系列的概念(如Class、SEL动分、Method毅糟、IMP),引入了面向?qū)ο罄焦⑾鬟f和轉(zhuǎn)發(fā)機(jī)制留特,從而實(shí)現(xiàn)了Runtime機(jī)制。

參考
Runtime 源碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玛瘸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苟蹈,更是在濱河造成了極大的恐慌糊渊,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慧脱,死亡現(xiàn)場(chǎng)離奇詭異渺绒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)菱鸥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門宗兼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氮采,你說我怎么就攤上這事殷绍。” “怎么了鹊漠?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵主到,是天一觀的道長(zhǎng)茶行。 經(jīng)常有香客問我,道長(zhǎng)登钥,這世上最難降的妖魔是什么畔师? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮牧牢,結(jié)果婚禮上看锉,老公的妹妹穿的比我還像新娘。我一直安慰自己塔鳍,他們只是感情好伯铣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著献幔,像睡著了一般懂傀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜡感,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天蹬蚁,我揣著相機(jī)與錄音,去河邊找鬼郑兴。 笑死犀斋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的情连。 我是一名探鬼主播叽粹,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼却舀!你這毒婦竟也來了虫几?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤挽拔,失蹤者是張志新(化名)和其女友劉穎辆脸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體螃诅,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啡氢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了术裸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倘是。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖袭艺,靈堂內(nèi)的尸體忽然破棺而出搀崭,到底是詐尸還是另有隱情,我是刑警寧澤猾编,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布门坷,位于F島的核電站宣鄙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏默蚌。R本人自食惡果不足惜冻晤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绸吸。 院中可真熱鬧鼻弧,春花似錦、人聲如沸锦茁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽码俩。三九已至度帮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稿存,已是汗流浹背笨篷。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓣履,地道東北人率翅。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袖迎,于是被迫代替她去往敵國(guó)和親冕臭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡(jiǎn)介 Runt...
    樂樂的簡(jiǎn)書閱讀 2,132評(píng)論 0 9
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 729評(píng)論 0 2
  • 我們常常會(huì)聽說 Objective-C 是一門動(dòng)態(tài)語言燕锥,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢辜贵?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,186評(píng)論 0 7
  • runtime 運(yùn)行時(shí)語言,實(shí)現(xiàn)Object-C的C語言庫(kù)归形,將OC轉(zhuǎn)換成C進(jìn)行編譯的過渡者念颈。 作為一門動(dòng)態(tài)編程語言...
    夜雨聲煩_閱讀 545評(píng)論 0 0
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 751評(píng)論 0 1