Objective-C Runtime總結(jié)

在伯樂(lè)在線看了7篇關(guān)于Objective-C Runtime的博文,確定很詳盡也很深入由捎。但是看起來(lái)有點(diǎn)凌亂,不容易懂。我認(rèn)為Objective-C Runtime主要包括如下幾個(gè)方便次绘。

1、數(shù)據(jù)類型,怎樣定義id邮偎,對(duì)象管跺,class,成員禾进,屬性豁跑,方法,分類泻云,協(xié)議等

2艇拍、消息執(zhí)行邏輯,方法查找宠纯,方法緩存卸夕,動(dòng)態(tài)添加。

3征椒、對(duì)象關(guān)聯(lián)娇哆。

在http://www.reibang.com/p/b1a6c51cfe3e里面的7篇文章說(shuō)得非常全面了,我就換個(gè)角度去總結(jié)吧勃救。OC class的定義如下圖

1碍讨、數(shù)據(jù)類型:

OC 1.0的就不說(shuō)了,那都是歷史了蒙秒。上面可以看到class定義里面還是有isa的Class勃黍。這個(gè)到底是什么呢?帶著問(wèn)題晕讲,再看看object的定義覆获。

struct objc_object { Class isa; };

object里面也包含了Class,這個(gè)Class又是什么呢瓢省?一個(gè)對(duì)象包含一個(gè)Class弄息,我覺(jué)得很正常,也是可以直接理解為就是創(chuàng)造這個(gè)類對(duì)象的類唄勤婚,但是為什么class里面還包含了一個(gè)Class呢摹量?這個(gè)到底是什么呢?這個(gè)類難道又是另外一個(gè)類創(chuàng)建的呢馒胆?細(xì)心的同學(xué)缨称,的確會(huì)這些疑問(wèn)。事實(shí)上OC里面還有一個(gè)隱藏的概念(Meta-class)祝迂,class里面對(duì)應(yīng)的isa就是該類的Meta-class睦尽。我覺(jué)得這個(gè)是OC很神奇的地方,不過(guò)也合理型雳。對(duì)象方法和類方法分來(lái)加載和存放当凡,的確可以節(jié)約內(nèi)存和提高加載的效率山害。

怎么證明我說(shuō)的是對(duì)的,不是瞎扯的呢宁玫?沒(méi)錯(cuò)就是就是想辦法打印類的地址粗恢。

NSLog(@"NSObject's class is %p", [NSObject class]);

NSLog(@"NSObject's class is %p",objc_getClass(class_getName([NSObject class])));

NSLog(@"NSObject's meta class is %p",objc_getMetaClass(class_getName([NSObject class])));

想學(xué)習(xí)的人,還是自己跑一跑代碼吧欧瘪,加深印象,通過(guò)打印的確發(fā)現(xiàn)兩個(gè)地址是不同的匙赞。

2016-04-05 10:24:06.538 test[806:67538] NSObject's class is 0x765000

2016-04-05 10:24:06.538 test[806:67538] NSObject's class is 0x765000

2016-04-05 10:24:06.538 test[806:67538] NSObject's meta class is 0x765014

這樣就證明的確有兩個(gè)類佛掖。那么怎樣知道Meta-class里面是存放類方法呢?沒(méi)錯(cuò)涌庭,就是打印方法表芥被。這個(gè)留給愛(ài)好者去干吧。最后再上一張經(jīng)典的圖坐榆,看不懂的就留言吧拴魄。

說(shuō)完了最基本的類,可以說(shuō)說(shuō)其他的了席镀,

id的定義

typedef struct objc_object *id;

成員列表

方法列表

方法的定義

typedef struct objc_method *Method;

struct objc_method {

SEL method_name? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

char *method_types? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

IMP method_imp? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

}

成員的定義

typedef struct objc_ivar *Ivar;

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

}

IMP的定義

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

cache的定義

typedef struct objc_cache *Cache

struct objc_cache {

unsigned int mask

/* total = mask + 1 */

OBJC2_UNAVAILABLE;

unsigned int occupied? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

Method buckets[1]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? OBJC2_UNAVAILABLE;

};

Category的定義

typedef struct objc_category *Category;

struct objc_category {

char *category_name????????????????????????? OBJC2_UNAVAILABLE; // 分類名

char *class_name???????????????????????????? OBJC2_UNAVAILABLE; // 分類所屬的類名

struct objc_method_list *instance_methods??? OBJC2_UNAVAILABLE; // 實(shí)例方法列表

struct objc_method_list *class_methods?????? OBJC2_UNAVAILABLE; // 類方法列表

struct objc_protocol_list *protocols???????? OBJC2_UNAVAILABLE; // 分類所實(shí)現(xiàn)的協(xié)議列表

}

Protocol的定義

typedef struct objc_object Protocol;

最后我們發(fā)現(xiàn)匹中,協(xié)議就是一個(gè)對(duì)象,Category和class很像豪诲。我們可以動(dòng)態(tài)創(chuàng)建協(xié)議顶捷,但是好像沒(méi)有方法修改Category。

還值得注意的是如下的定義屎篱,很有用服赎。

struct objc_super { id receiver; Class superClass; };

2、消息執(zhí)行邏輯

說(shuō)到消息交播,肯定要提到msg_send的重虑,msg_send的原型如下:

objc_msgSend(receiver, selector, arg1, arg2, ...)

receiver是一個(gè)非常值得關(guān)心的東西,例如[self class]和[super class]秦士,那他們的receiver到底是誰(shuí)呢缺厉,上面還特意提到了struct objc_super,事實(shí)上super的receiver依然是self伍宦。

objc_msgSend的執(zhí)行過(guò)程如下芽死,很簡(jiǎn)單明了。但是這只是正常情況的調(diào)用過(guò)程次洼。

好吧关贵,我決定再上一張網(wǎng)上找的圖,這個(gè)圖比較全面卖毁。

這張圖就是比完整了揖曾,包括動(dòng)態(tài)調(diào)用的流程落萎。這個(gè)調(diào)用過(guò)程沒(méi)有例子是很難說(shuō)得清楚的,在這里就不再展開說(shuō)了炭剪,有了這個(gè)圖练链,看伯樂(lè)在線的博文,也比較容易懂了奴拦。有機(jī)會(huì)的話媒鼓,我寫幾個(gè)例子玩一玩吧。

3错妖、對(duì)象關(guān)聯(lián)

類本身是不支持動(dòng)態(tài)添加成員的绿鸣,除非你動(dòng)態(tài)創(chuàng)建類的時(shí)候添加進(jìn)去,一旦類注冊(cè)了就不能再添加了暂氯,協(xié)議也是如此潮模,一旦發(fā)布了,就不能修改了痴施。這樣不科學(xué)呀擎厢,很多時(shí)候我們需要?jiǎng)討B(tài)添加成員,那怎么辦呀辣吃?于是后來(lái)有了對(duì)象關(guān)聯(lián)动遭,當(dāng)然還是可以添加屬性的,setValue等

void objc_setAssociatedObject ( id object,constvoid*key, id value, objc_AssociationPolicy policy );

id objc_getAssociatedObject ( id object,constvoid*key );

void objc_removeAssociatedObjects ( id object );

對(duì)象關(guān)聯(lián)比較簡(jiǎn)單齿尽,也挺常用的沽损。

好了,關(guān)于Objective-C Runtime的總結(jié)就到此為止吧循头。以后有時(shí)間再折騰一下下绵估。。卡骂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末国裳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子全跨,更是在濱河造成了極大的恐慌缝左,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浓若,死亡現(xiàn)場(chǎng)離奇詭異渺杉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)挪钓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門是越,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碌上,你說(shuō)我怎么就攤上這事倚评∑只玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵天梧,是天一觀的道長(zhǎng)盔性。 經(jīng)常有香客問(wèn)我,道長(zhǎng)呢岗,這世上最難降的妖魔是什么冕香? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮敷燎,結(jié)果婚禮上暂筝,老公的妹妹穿的比我還像新娘。我一直安慰自己硬贯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布陨收。 她就那樣靜靜地躺著饭豹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪务漩。 梳的紋絲不亂的頭發(fā)上拄衰,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音饵骨,去河邊找鬼翘悉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛居触,可吹牛的內(nèi)容都是我干的妖混。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼轮洋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼制市!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起弊予,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祥楣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后汉柒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體误褪,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年碾褂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兽间。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斋扰,死狀恐怖渡八,靈堂內(nèi)的尸體忽然破棺而出啃洋,到底是詐尸還是另有隱情,我是刑警寧澤屎鳍,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布宏娄,位于F島的核電站,受9級(jí)特大地震影響逮壁,放射性物質(zhì)發(fā)生泄漏孵坚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一窥淆、第九天 我趴在偏房一處隱蔽的房頂上張望卖宠。 院中可真熱鬧,春花似錦忧饭、人聲如沸扛伍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刺洒。三九已至,卻和暖如春吼砂,著一層夾襖步出監(jiān)牢的瞬間逆航,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工渔肩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留因俐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓周偎,卻偏偏與公主長(zhǎng)得像抹剩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栏饮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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

  • 我們常常會(huì)聽(tīng)說(shuō) Objective-C 是一門動(dòng)態(tài)語(yǔ)言吧兔,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,195評(píng)論 0 7
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 734評(píng)論 0 2
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉袍嬉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,715評(píng)論 0 9
  • 本文詳細(xì)整理了 Cocoa 的 Runtime 系統(tǒng)的知識(shí)境蔼,它使得 Objective-C 如虎添翼,具備了靈活的...
    lylaut閱讀 800評(píng)論 0 4
  • 原文出處:南峰子的技術(shù)博客 Objective-C語(yǔ)言是一門動(dòng)態(tài)語(yǔ)言伺通,它將很多靜態(tài)語(yǔ)言在編譯和鏈接時(shí)期做的事放到了...
    _燴面_閱讀 1,231評(píng)論 1 5