OC runtime那點(diǎn)事

RunTime簡(jiǎn)稱(chēng)運(yùn)行時(shí)蒿褂。就是系統(tǒng)在運(yùn)行的時(shí)候的一些機(jī)制监嗜,其中最主要的是消息機(jī)制非迹。對(duì)于C語(yǔ)言毕泌,函數(shù)的調(diào)用在編譯的時(shí)候會(huì)決定調(diào)用哪個(gè)函數(shù)( C語(yǔ)言的函數(shù)調(diào)用請(qǐng)看這里 )喝检。編譯完成之后直接順序執(zhí)行,無(wú)任何二義性撼泛。OC的函數(shù)調(diào)用成為消息發(fā)送蛇耀。屬于動(dòng)態(tài)調(diào)用過(guò)程。在編譯的時(shí)候并不能決定真正調(diào)用哪個(gè)函數(shù)(事實(shí)證明坎弯,在編 譯階段纺涤,OC可以調(diào)用任何函數(shù),即使這個(gè)函數(shù)并未實(shí)現(xiàn)抠忘,只要申明過(guò)就不會(huì)報(bào)錯(cuò)撩炊。而C語(yǔ)言在編譯階段就會(huì)報(bào)錯(cuò))。只有在真正運(yùn)行的時(shí)候才會(huì)根據(jù)函數(shù)的名稱(chēng)找 到對(duì)應(yīng)的函數(shù)來(lái)調(diào)用崎脉。

[obj makeText];

其中obj是一個(gè)對(duì)象拧咳,makeText是一個(gè)函數(shù)名稱(chēng)。對(duì)于這樣一個(gè)簡(jiǎn)單的調(diào)用囚灼。在編譯時(shí)RunTime會(huì)將上述代碼轉(zhuǎn)化成

objc_msgSend(obj,@selector(makeText));

首先我們來(lái)看看obj這個(gè)對(duì)象骆膝,iOS中的obj都繼承于NSObject祭衩。

@interface NSObject <nsobject> {

    Class isa  OBJC_ISA_AVAILABILITY;

}</nsobject>

在NSObjcet中存在一個(gè)Class的isa指針。然后我們看看
Class:

typedef struct objc_class *Class;

struct objc_class {

  Class isa; // 指向metaclass

   

  Class super_class ; // 指向其父類(lèi)

  const char *name ; // 類(lèi)名

  long version ; // 類(lèi)的版本信息阅签,初始化默認(rèn)為0掐暮,可以通過(guò)runtime函數(shù)class_setVersion和class_getVersion進(jìn)行修改、讀取

  long info; // 一些標(biāo)識(shí)信息,如CLS_CLASS (0x1L) 表示該類(lèi)為普通 class 政钟,其中包含對(duì)象方法和成員變量;CLS_META (0x2L) 表示該類(lèi)為 metaclass路克,其中包含類(lèi)方法;

  long instance_size ; // 該類(lèi)的實(shí)例變量大小(包括從父類(lèi)繼承下來(lái)的實(shí)例變量);

  struct objc_ivar_list *ivars; // 用于存儲(chǔ)每個(gè)成員變量的地址

  struct objc_method_list **methodLists ; // 與 info 的一些標(biāo)志位有關(guān),如CLS_CLASS (0x1L),則存儲(chǔ)對(duì)象方法,如CLS_META (0x2L)养交,則存儲(chǔ)類(lèi)方法;

  struct objc_cache *cache; // 指向最近使用的方法的指針精算,用于提升效率;

  struct objc_protocol_list *protocols; // 存儲(chǔ)該類(lèi)遵守的協(xié)議

    }

我們可以看到碎连,對(duì)于一個(gè)Class類(lèi)中灰羽,存在很多東西,下面我來(lái)一一解釋一下:

Class isa:指向metaclass鱼辙,也就是靜態(tài)的Class谦趣。一般一個(gè)Obj對(duì)象中的isa會(huì)指向普通的Class,這個(gè)Class中存儲(chǔ)普通成員變量和對(duì) 象方法(“-”開(kāi)頭的方法)座每,普通Class中的isa指針指向靜態(tài)Class前鹅,靜態(tài)Class中存儲(chǔ)static類(lèi)型成員變量和類(lèi)方法(“+”開(kāi)頭的方 法)。

Class super_class:指向父類(lèi)峭梳,如果這個(gè)類(lèi)是根類(lèi)舰绘,則為NULL。

注意:所有metaclass中isa指針都指向跟metaclass葱椭。而跟metaclass則指向自身捂寿。Root metaclass是通過(guò)繼承Root class產(chǎn)生的。與root class結(jié)構(gòu)體成員一致孵运,也就是前面提到的結(jié)構(gòu)秦陋。不同的是Root metaclass的isa指針指向自身。

Class類(lèi)中其他的成員這里就先不做過(guò)多解釋了治笨,下面我們來(lái)看看:
@selector (makeText):這是一個(gè)SEL方法選擇器驳概。SEL其主要作用是快速的通過(guò)方法名字(makeText)查找到對(duì)應(yīng)方法的函數(shù)指針,然后調(diào)用其函 數(shù)旷赖。SEL其本身是一個(gè)Int類(lèi)型的一個(gè)地址顺又,地址中存放著方法的名字。對(duì)于一個(gè)類(lèi)中等孵。每一個(gè)方法對(duì)應(yīng)著一個(gè)SEL稚照。所以iOS類(lèi)中不能存在2個(gè)名稱(chēng)相同 的方法,即使參數(shù)類(lèi)型不同,因?yàn)镾EL是根據(jù)方法名字生成的果录,相同的方法名稱(chēng)只能對(duì)應(yīng)一個(gè)SEL上枕。
下面我們就來(lái)看看具體消息發(fā)送之后是怎么來(lái)動(dòng)態(tài)查找對(duì)應(yīng)的方法的。
首先弱恒,編譯器將代碼[obj makeText];轉(zhuǎn)化為objc_msgSend(obj, @selector (makeText));辨萍,在objc_msgSend函數(shù)中。首先通過(guò)obj的isa指針找到obj對(duì)應(yīng)的class斤彼。在Class中先去cache中 通過(guò)SEL查找對(duì)應(yīng)函數(shù)method(猜測(cè)cache中method列表是以SEL為key通過(guò)hash表來(lái)存儲(chǔ)的分瘦,這樣能提高函數(shù)查找速度)蘸泻,若 cache中未找到琉苇。再去methodList中查找,若methodlist中未找到悦施,則取superClass中查找并扇。若能找到,則將method加 入到cache中抡诞,以方便下次查找穷蛹,并通過(guò)method中的函數(shù)指針跳轉(zhuǎn)到對(duì)應(yīng)的函數(shù)中去執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昼汗,一起剝皮案震驚了整個(gè)濱河市肴熏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌顷窒,老刑警劉巖蛙吏,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鞋吉,居然都是意外死亡鸦做,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)谓着,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泼诱,“玉大人,你說(shuō)我怎么就攤上這事赊锚≈瓮玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵舷蒲,是天一觀的道長(zhǎng)矢炼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)阿纤,這世上最難降的妖魔是什么句灌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上胰锌,老公的妹妹穿的比我還像新娘骗绕。我一直安慰自己,他們只是感情好资昧,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布酬土。 她就那樣靜靜地躺著,像睡著了一般格带。 火紅的嫁衣襯著肌膚如雪撤缴。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天叽唱,我揣著相機(jī)與錄音屈呕,去河邊找鬼。 笑死棺亭,一個(gè)胖子當(dāng)著我的面吹牛虎眨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播镶摘,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嗽桩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了凄敢?” 一聲冷哼從身側(cè)響起碌冶,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涝缝,沒(méi)想到半個(gè)月后扑庞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俊卤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年嫩挤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片消恍。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岂昭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狠怨,到底是詐尸還是另有隱情约啊,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布恰矩,位于F島的核電站,受9級(jí)特大地震影響憎蛤,放射性物質(zhì)發(fā)生泄漏外傅。R本人自食惡果不足惜纪吮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萎胰。 院中可真熱鬧碾盟,春花似錦、人聲如沸技竟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榔组。三九已至熙尉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搓扯,已是汗流浹背检痰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擅编,地道東北人攀细。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓箫踩,卻偏偏與公主長(zhǎng)得像爱态,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子境钟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉锦担,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,679評(píng)論 0 9
  • 運(yùn)行時(shí)是iOS中一個(gè)很重要的概念,iOS運(yùn)行過(guò)程中都會(huì)被轉(zhuǎn)化為runtime的C代碼執(zhí)行慨削。例如[target do...
    蘿卜醬紫閱讀 387評(píng)論 0 3
  • 我們常常會(huì)聽(tīng)說(shuō) Objective-C 是一門(mén)動(dòng)態(tài)語(yǔ)言洞渔,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,176評(píng)論 0 7
  • 原文出處:南峰子的技術(shù)博客 Objective-C語(yǔ)言是一門(mén)動(dòng)態(tài)語(yǔ)言缚态,它將很多靜態(tài)語(yǔ)言在編譯和鏈接時(shí)期做的事放到了...
    _燴面_閱讀 1,215評(píng)論 1 5
  • Objective-C語(yǔ)言是一門(mén)動(dòng)態(tài)語(yǔ)言磁椒,他將很多靜態(tài)語(yǔ)言在編譯和鏈接時(shí)期做的事情放到了運(yùn)行時(shí)來(lái)處理。這種動(dòng)態(tài)語(yǔ)言...
    tigger丨閱讀 1,381評(píng)論 0 8