runtime/消息轉(zhuǎn)發(fā)機(jī)制

1> 什么是runtime
runtime是一套比較底層的純C語言API, 屬于1個(gè)C語言庫, 包含了很多底層的C語言API泥畅。
在我們平時(shí)編寫的OC代碼中, 程序運(yùn)行過程時(shí), 其實(shí)最終都是轉(zhuǎn)成了runtime的C語言代碼, runtime算是OC的幕后工作者,objc_msgSend
2> runtime干什么用,使用場(chǎng)景
runtime是屬于OC的底層, 可以進(jìn)行一些非常底層的操作(用OC是無法現(xiàn)實(shí)的, 不好實(shí)現(xiàn))
在程序運(yùn)行過程中, 動(dòng)態(tài)創(chuàng)建一個(gè)類(比如KVO的底層實(shí)現(xiàn)) objc_allocateClassPair何鸡,class_addIvar酌泰,objc_registerClassPair
在程序運(yùn)行過程中, 動(dòng)態(tài)地為某個(gè)類添加屬性\方法, 修改屬性值\方法(修改封裝的框架) objc_setAssociatedObject object_setIvar

遍歷一個(gè)類的所有成員變量(屬性)\所有方法(字典轉(zhuǎn)模型,歸解檔) class_copyIvarList class_copyPropertyList class_copyMethodList
(class_copyPropertyList返回的僅僅是對(duì)象類的屬性(@property申明的屬性),而class_copyIvarList返回類的所有屬性和變量(包括在@interface大括號(hào)中聲明的變量)
2.消息機(jī)制
1> 消息轉(zhuǎn)發(fā)的原理
當(dāng)向一個(gè)對(duì)象發(fā)送消息時(shí)特铝,objc_msgSend方法根據(jù)對(duì)象的isa指針找到對(duì)象的類慨仿,然后在類的調(diào)度表(dispatch table)中查找selector所坯。如果無法找到selector,objc_msgSend通過指向父類的指針找到父類锋八,并在父類的調(diào)度表(dispatch table)中查找selector浙于,以此類推直到NSObject類。一旦查找到selector挟纱,objc_msgSend方法根據(jù)調(diào)度表的內(nèi)存地址調(diào)用該實(shí)現(xiàn)羞酗。 通過這種方式,message與方法的真正實(shí)現(xiàn)在執(zhí)行階段才綁定紊服。
為了保證消息發(fā)送與執(zhí)行的效率檀轨,系統(tǒng)會(huì)將全部selector和使用過的方法的內(nèi)存地址緩存起來。每個(gè)類都有一個(gè)獨(dú)立的緩存围苫,緩存包含有當(dāng)前類自己的 selector以及繼承自父類的selector裤园。查找調(diào)度表(dispatch table)前,消息發(fā)送系統(tǒng)首先檢查receiver對(duì)象的緩存剂府。
緩存命中的情況下,消息發(fā)送(messaging)比直接調(diào)用方法(function call)只慢一點(diǎn)點(diǎn)點(diǎn)點(diǎn)剃盾。
2> SEL isa super cmd 是什么
sel: 一種類型,表示方法名稱,類似字符串(可互轉(zhuǎn))
isa:在方法底層對(duì)應(yīng)的objc_msgSend調(diào)用時(shí),會(huì)根據(jù)isa找到對(duì)象所在的類對(duì)象,類對(duì)象中包含了調(diào)度表(dispatch table),該表將類的sel和方法的實(shí)際內(nèi)存地址關(guān)聯(lián)起來
super_class:每一個(gè)類中還包含了一個(gè)super_class指針,用來指向父類對(duì)象
_cmd在Objective-C的方法中表示當(dāng)前方法的selector腺占,正如同self表示當(dāng)前方法調(diào)用的對(duì)象實(shí)例
IMP定義為 id (*IMP) (id, SEL, …)。這樣說來痒谴, IMP是一個(gè)指向函數(shù)的指針衰伯,這個(gè)被指向的函數(shù)包括id(“self”指針),調(diào)用的SEL(方法名)积蔚,再加上一些其他參數(shù).說白了IMP就是實(shí)現(xiàn)方法
3> 動(dòng)態(tài)綁定
—在運(yùn)行時(shí)確定要調(diào)用的方法
動(dòng)態(tài)綁定將調(diào)用方法的確定也推遲到運(yùn)行時(shí)意鲸。在編譯時(shí),方法的 調(diào)用并不和代碼綁定在一起尽爆,只有在消實(shí)發(fā)送出來之后怎顾,才確定被調(diào)用的代碼。通過動(dòng)態(tài)類型和動(dòng)態(tài)綁定技術(shù)漱贱,您的代碼每次執(zhí)行都可以得到不同的結(jié)果槐雾。運(yùn)行時(shí)因 子負(fù)責(zé)確定消息的接收者和被調(diào)用的方法。運(yùn)行時(shí)的消息分發(fā)機(jī)制為動(dòng)態(tài)綁定提供支持幅狮。當(dāng)您向一個(gè)動(dòng)態(tài)類型確定了的對(duì)象發(fā)送消息時(shí)募强,運(yùn)行環(huán)境系統(tǒng)會(huì)通過接收者 的isa指針定位對(duì)象的類,并以此為起點(diǎn)確定被調(diào)用的方法崇摄,方法和消息是動(dòng)態(tài)綁定的擎值。而且,您不必在Objective-C 代碼中做任何工作逐抑,就可以自動(dòng)獲取動(dòng)態(tài)綁定的好處鸠儿。您在每次發(fā)送消息時(shí),特別是當(dāng)消息的接收者是動(dòng)態(tài)類型已經(jīng)確定的對(duì)象時(shí)泵肄,動(dòng)態(tài)綁定就會(huì)例行而透明地發(fā)生捆交。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淑翼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子品追,更是在濱河造成了極大的恐慌玄括,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肉瓦,死亡現(xiàn)場(chǎng)離奇詭異遭京,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泞莉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門哪雕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鲫趁,你說我怎么就攤上這事斯嚎。” “怎么了挨厚?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵堡僻,是天一觀的道長。 經(jīng)常有香客問我疫剃,道長钉疫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任巢价,我火速辦了婚禮牲阁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壤躲。我一直安慰自己城菊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布柒爵。 她就那樣靜靜地躺著役电,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棉胀。 梳的紋絲不亂的頭發(fā)上法瑟,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音唁奢,去河邊找鬼霎挟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛麻掸,可吹牛的內(nèi)容都是我干的酥夭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼熬北!你這毒婦竟也來了疙描?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤讶隐,失蹤者是張志新(化名)和其女友劉穎起胰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巫延,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡效五,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炉峰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畏妖。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疼阔,靈堂內(nèi)的尸體忽然破棺而出戒劫,到底是詐尸還是另有隱情,我是刑警寧澤竿开,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布谱仪,位于F島的核電站,受9級(jí)特大地震影響否彩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗦随,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一列荔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枚尼,春花似錦贴浙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盯质,卻和暖如春袁串,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呼巷。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工囱修, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人王悍。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓破镰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鲜漩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉源譬,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,686評(píng)論 0 9
  • Objective-C 擴(kuò)展了 C 語言,并加入了面向?qū)ο筇匦院?Smalltalk 式的消息傳遞機(jī)制孕似。而這個(gè)擴(kuò)展...
    Zsz丶少閱讀 299評(píng)論 0 0
  • 我們常常會(huì)聽說 Objective-C 是一門動(dòng)態(tài)語言踩娘,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,182評(píng)論 0 7
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,548評(píng)論 33 466
  • 讓我吃不好睡不好鳞青,你比感冒還厲害呢
    李虎頭閱讀 70評(píng)論 0 0