iOS Runtime詳解之SEL,Class,id,IMP,_cmd,isa,method,Ivar

什么是runtime?

Objective C語言把能在運(yùn)行期做的事情就推遲到運(yùn)行期再決定。這就意味著壮莹,Objective C不僅需要一個編譯器,而且需要一個運(yùn)行期環(huán)境姻檀。這個運(yùn)行期環(huán)境就是Runtime命满。

最直接的例子就是方法調(diào)用
這樣的一個OC方法

[receiver message]

會被編譯成

objc_msgSend(receiver, selector)

這里,先記著receiver就是接受消息的對象绣版,selector是執(zhí)行消息的函數(shù)體名稱,是個C的字符串胶台。而不是像其他語言一樣,直接編譯成一個指向函數(shù)體的指針杂抽。

那么诈唬,在運(yùn)行的時候,如何通過objc_msgSend(receiver, selector)找到實(shí)際的函數(shù)體呢默怨?

SEL/objc_selector

  • objc_selector
    透明的數(shù)據(jù)結(jié)構(gòu)讯榕,可以理解為C String

  • SEL
    源代碼定義

typedef struct objc_selector *SEL;

也就是說骤素,SEL是指向一個C String的指針匙睹。

id/objc_object

  • id
    指向一個類的實(shí)例對象
    底層代碼定義
typedef struct objc_object *id;

其中

  • objc_object
    底層定義
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

可以看到愚屁,objc_object中,只是保存了一個Class類型的isa痕檬。這里看不懂不要怕霎槐,先記著,對象中就是保存了一個指向Objective C中對應(yīng)類的指針梦谜。

Class/objc_class

  • Class
    指向Objective C類對象(objc_class)的一個指針
    底層定義
typedef struct objc_class *Class;
  • objc_class
    底層定義
struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

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

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

可以看到丘跌,這就是類對象結(jié)構(gòu)體的定義,細(xì)心的同學(xué)可能發(fā)現(xiàn)了類對象里仍然有一個指針Class isa唁桩,先記著闭树,這個isa指向的是類元對象。這個我會在下一篇文章里詳細(xì)闡述

IMP

  • IMP-指向?qū)嶋H執(zhí)行函數(shù)體的函數(shù)指針
#if !OBJC_OLD_DISPATCH_PROTOTYPES
typedef void (*IMP)(void /* id, SEL, ... */ ); 
#else
typedef id (*IMP)(id, SEL, ...); 
#endif

可以看到荒澡,這個函數(shù)體前兩個參數(shù)是 id(消息接受者报辱,也就是對象),以及SEL(方法的名字)

method/objc_method

  • method - 指向Objective C中的方法的指針
typedef struct objc_method *Method;

其中

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

_cmd

SEL 類型的一個變量单山,Objective C的函數(shù)的前兩個隱藏參數(shù)為self 和 _cmd

Ivar

  • ivar - objective C中的實(shí)例變量
typedef struct objc_ivar *Ivar;

可以看到變量的內(nèi)存模型

struct objc_ivar {
    char *ivar_name                                          OBJC2_UNAVAILABLE;
    char *ivar_type                                          OBJC2_UNAVAILABLE;
    int ivar_offset                                          OBJC2_UNAVAILABLE;
#ifdef __LP64__
    int space                                                OBJC2_UNAVAILABLE;
#endif
}                                                            OBJC2_UNAVAILABLE;

這篇文件是轉(zhuǎn)載過來碍现,后續(xù)重新編輯。


作者:黃文臣
來源:CSDN
原文:https://blog.csdn.net/Hello_Hwc/article/details/49682857
版權(quán)聲明:本文為博主原創(chuàng)文章米奸,轉(zhuǎn)載請附上博文鏈接昼接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市悴晰,隨后出現(xiàn)的幾起案子慢睡,更是在濱河造成了極大的恐慌,老刑警劉巖铡溪,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件一睁,死亡現(xiàn)場離奇詭異,居然都是意外死亡佃却,警方通過查閱死者的電腦和手機(jī)者吁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饲帅,“玉大人复凳,你說我怎么就攤上這事≡畋茫” “怎么了育八?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赦邻。 經(jīng)常有香客問我髓棋,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任按声,我火速辦了婚禮膳犹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘签则。我一直安慰自己须床,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布渐裂。 她就那樣靜靜地躺著豺旬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柒凉。 梳的紋絲不亂的頭發(fā)上族阅,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音膝捞,去河邊找鬼耘分。 笑死,一個胖子當(dāng)著我的面吹牛绑警,可吹牛的內(nèi)容都是我干的求泰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼计盒,長吁一口氣:“原來是場噩夢啊……” “哼渴频!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起北启,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卜朗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咕村,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體场钉,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年懈涛,在試婚紗的時候發(fā)現(xiàn)自己被綠了逛万。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡批钠,死狀恐怖宇植,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埋心,我是刑警寧澤指郁,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拷呆,受9級特大地震影響闲坎,放射性物質(zhì)發(fā)生泄漏疫粥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一腰懂、第九天 我趴在偏房一處隱蔽的房頂上張望梗逮。 院中可真熱鬧,春花似錦悯恍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贷屎,卻和暖如春罢防,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背唉侄。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工咒吐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人属划。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓恬叹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親同眯。 傳聞我的和親對象是個殘疾皇子绽昼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

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