Objective-C中的runtime理解

Objective-C是一門動態(tài)語言,為什么是動態(tài)語言,是因為Objective-C除了有自己的編譯器外,他還有一套系統(tǒng)來進行動態(tài)的創(chuàng)建類和對象以及消息的發(fā)送捡遍、傳遞,這套系統(tǒng)就是:runtime竹握。
首先画株,objc(以下Objective-C都用objc代替,我覺得大家也都懂的)雖然是Apple的程序的核心語言,Apple自己也是一個封閉的系統(tǒng)谓传,但是objc本身是一套開源的語言蜈项,想看他的源代碼,地址是:

http://opensource.apple.com/tarballs/objc4/

我看的是objc4-647.tar.gz版本良拼,接下來,我來說說自己對于runtime的理解充边。

消息傳遞

我是做iOS開發(fā)的庸推,我們最常見到的方法調用就是下面這樣的:

[aFunc foo];  //aFunc為某類的一實例化對象,foo為該類中的一個方法浇冰。

這是一個很常見的方法調用的例子贬媒,但與靜態(tài)語言不同,使用這句方法時肘习,編譯器會把這句代碼轉化另外一句純C語言的方法际乘,在message.h中有如下定義:

id objc_msgSend(id self, SEL op, ...);

根據這句方法,我們開始我們的runtime理解漂佩。

首先脖含,什么是id,在objc.h中有如下定義:

/// A pointer to an instance of a class.
typedef struct objc_object *id; 

可以看得出投蝉,id是一個指向objc_object結構體的指針养葵,那么objc_object是怎樣的?在objc.h中有如下定義:

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

可以看出瘩缆,這個結構體中主要就是一個Class isa的成員关拒,這個成員指向了所屬的類。那么Class是怎么定義的呢庸娱?在objc.h中有如下定義:

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

這樣就很明顯了着绊,Class是一個指向objc_class結構體的指針,那么就到objc_class了熟尉,這是在runtime.h中的定義:

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;

通過OBJC2_UNAVAILABLE可以看得出归露,objc2中這套定義已經不用了,我們先不說objc2中是怎樣的斤儿,我們先通過這套定義來管中窺豹靶擦。

isa是一個Class對象的Class,即:Meta Class雇毫。面向對象中玄捕,Class本身也是一個對象,因為在objc-runtime-new.h中有如下定義:

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags
    ...

這里的objc_class也是繼承于objc_object棚放,所以枚粘,Class在設計上也是一個對象。


接下來的我閑了繼續(xù)寫飘蚯,開了好幾個坑了馍迄。福也。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末攀圈,一起剝皮案震驚了整個濱河市暴凑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赘来,老刑警劉巖现喳,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異犬辰,居然都是意外死亡嗦篱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門幌缝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灸促,“玉大人,你說我怎么就攤上這事涵卵≡≡裕” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵轿偎,是天一觀的道長吃度。 經常有香客問我,道長贴硫,這世上最難降的妖魔是什么椿每? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮英遭,結果婚禮上间护,老公的妹妹穿的比我還像新娘。我一直安慰自己挖诸,他們只是感情好汁尺,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著多律,像睡著了一般痴突。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狼荞,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天辽装,我揣著相機與錄音,去河邊找鬼相味。 笑死拾积,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播拓巧,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼斯碌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肛度?” 一聲冷哼從身側響起傻唾,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎承耿,沒想到半個月后冠骄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡瘩绒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年猴抹,在試婚紗的時候發(fā)現(xiàn)自己被綠了带族。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锁荔。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝙砌,靈堂內的尸體忽然破棺而出阳堕,到底是詐尸還是另有隱情,我是刑警寧澤择克,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布恬总,位于F島的核電站,受9級特大地震影響肚邢,放射性物質發(fā)生泄漏壹堰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一骡湖、第九天 我趴在偏房一處隱蔽的房頂上張望贱纠。 院中可真熱鬧,春花似錦响蕴、人聲如沸谆焊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辖试。三九已至,卻和暖如春劈狐,著一層夾襖步出監(jiān)牢的瞬間罐孝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工肥缔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肾档,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像怒见,于是被迫代替她去往敵國和親俗慈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容