iOS中消息機制

OC語言是C語言的超集贝室,C語言有個特點就是在編譯期間就已經(jīng)確定了對應的被調(diào)用的方法沾鳄,行業(yè)術語是以靜態(tài)綁定的方式進行地址定位诸蚕,而調(diào)用方法以硬編碼的形式存儲舀射,某種程度上也側(cè)面說明其運行效率高。而OC語言的方法調(diào)用采用向?qū)ο蟀l(fā)送消息的形式進行驹碍,所以對于方法的調(diào)用并不能在編譯期間確定方法的所處內(nèi)存地址壁涎。

給對象發(fā)送消息是通過objc_msgSend(_cmd, sel, ...)方法進行的凡恍,所以每個對象接收者都會存一張方法表,如果該表中含有存儲的方法怔球,此時會直接跳到方法實現(xiàn)中執(zhí)行相應的方法體嚼酝。假如每次都查找類中所存儲的方法表,那么勢必會影響方法執(zhí)行的效率竟坛。為此闽巩,OC在每個類中都添加了一個方法緩存表(fast map),這樣就能將第一次查找的方法存儲在緩存表里担汤,下次需要用的時候直接從緩存表里直接拿到方法體涎跨,以保證正常的方法調(diào)用效率

在理解消息轉(zhuǎn)發(fā)之前崭歧,先了解一下OC中的對象

在OC中對象分為三類隅很,分別是實例對象、類對象以及元類對象率碾,這三類對象之間是有聯(lián)系的外构。從isa指針指向來說的話,實例對象的isa指針指向類對象播掷,類對象的isa指針指向元類對象,元類對象的isa指針指向基類元類對象撼班。因為OC中類實質(zhì)是一個結(jié)構體歧匈,除了isa指針,還包含superclass指針(實質(zhì)都是NSObject的對象)砰嘁,還包含屬性方法表等件炉。類是對數(shù)據(jù)以及方法的封裝,所以這三者的關系鏈也就由isa指針鏈接起來了矮湘。

網(wǎng)圖.png

isa指針的實際應用

不如說一個場景斟冕,如果調(diào)用類Class_a中的方法method_a,此時系統(tǒng)會通過實例對象中的isa指針找到類對象缅阳,然后通過查找在類對象中存儲的方法表磕蛇,找到要執(zhí)行的方法。同理十办,如果要調(diào)用類Class_a中的類方法class_method_a秀撇,此時系統(tǒng)會通過類對象中的isa指針找到當前類的元類對象,然后通過元類對象中的方法表找到對應的類方法向族,進而調(diào)用呵燕。

網(wǎng)圖

所以類對象存儲了實例對象的相關的屬性方法信息,元類對象存儲了類對象的相關的屬性方法信息件相。調(diào)用鏈也是沿著類信息存儲方向進行調(diào)用的再扭。

superclass 指針的作用

類中存儲的superclass是用來指向繼承關系的父類對象的氧苍,依舊說場景。

網(wǎng)圖
  • 如果想要調(diào)用Student實例對象的基類Person對象方法泛范,調(diào)用過程是什么樣的呢让虐?

首先會通過Student實例對象的isa指針找到Student的類對象,通過查找類對象方法表存儲的方法敦跌,在沒有找到的情況下澄干,通過Superclass指針找到Student的繼承的類對象Person進行方法索引,找到調(diào)用其方法柠傍。

  • 如果想要調(diào)用Student實例對象的NSObject對象方法麸俘,過程如何?

首先會通過Student的實例對象的isa指針找到Student的類對象惧笛,通過查找Student的類對象Person存儲的方法表从媚,不存在的話,再通過Person類對象中的isa指針找到Person的元類對象患整,最后查找存儲在元類對象的屬性方法表找到要調(diào)用的的方法拜效,最后調(diào)用。

匯總

以下圖為例說明

網(wǎng)圖
  • isa指向問題
  • 實例對象Instance 的isa指向類對象Class
  • 類對象Class的isa指針指向元類對象meta-class
  • 基類的元類對象meta-class的isa指向自己
  • superclass指向問題
  • 類對象class的superclass指針指向父類的class類對象各谚,如果沒有父類紧憾,superclass指針為nil
  • 元類對象meta-classsuperclass指向父類的元類對象meta-class,基類的元類對象meta-classsuperclass指向基類的類對象class(注意是基類的對象class)
  • 實例對象instance調(diào)用對象方法的過程鏈
  • 通過實例對象instance的isa指針找到類對象class昌渤,找到即調(diào)用
  • 如果找不到赴穗,通過實例對象的instance中的superclass找到父類對象,通過父類對象的isa指針找到父類對象的類對象class膀息,找到調(diào)用方法
  • 如果仍然找不到般眉,那么系統(tǒng)會通過消息轉(zhuǎn)發(fā)機制進行消息轉(zhuǎn)發(fā),走消息轉(zhuǎn)發(fā)的響應鏈潜支,最后如果都沒有能夠處理消息的方法的話甸赃,那么會拋出unselector 的異常
  • 類對象調(diào)用類方法的過程鏈
  • 通過類對象class isa指針找到元類對象meta-class,通過存儲在元類對象的方法表查找對應的方法進行調(diào)用
  • 如果沒有找到冗酿,那么通過classsuperclass 指針找到父類superclass埠对,然后通過父類的superclassisa指針找到父類的元類對象super-meta-class,通過存儲在父類的元類對象meta-class找到類對象進行調(diào)用已烤。
  • 關于class對象鸠窗、meta-class對象的本質(zhì)

class對象、meta-class對象的本質(zhì)是結(jié)構體 struct objc_class.

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胯究,一起剝皮案震驚了整個濱河市稍计,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裕循,老刑警劉巖臣嚣,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件净刮,死亡現(xiàn)場離奇詭異,居然都是意外死亡硅则,警方通過查閱死者的電腦和手機淹父,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怎虫,“玉大人暑认,你說我怎么就攤上這事〈笊螅” “怎么了蘸际?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長徒扶。 經(jīng)常有香客問我粮彤,道長,這世上最難降的妖魔是什么姜骡? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任导坟,我火速辦了婚禮,結(jié)果婚禮上圈澈,老公的妹妹穿的比我還像新娘惫周。我一直安慰自己,他們只是感情好康栈,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布闯两。 她就那樣靜靜地躺著,像睡著了一般谅将。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上重慢,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天饥臂,我揣著相機與錄音,去河邊找鬼似踱。 笑死隅熙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的核芽。 我是一名探鬼主播囚戚,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轧简!你這毒婦竟也來了驰坊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤哮独,失蹤者是張志新(化名)和其女友劉穎拳芙,沒想到半個月后察藐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡舟扎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年分飞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睹限。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡譬猫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羡疗,到底是詐尸還是另有隱情染服,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布顺囊,位于F島的核電站肌索,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏特碳。R本人自食惡果不足惜诚亚,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望午乓。 院中可真熱鬧站宗,春花似錦、人聲如沸益愈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒸其。三九已至敏释,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摸袁,已是汗流浹背钥顽。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留靠汁,地道東北人蜂大。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像蝶怔,于是被迫代替她去往敵國和親奶浦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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