OC消息機(jī)制

1.消息機(jī)制
RunTime簡(jiǎn)稱運(yùn)行時(shí)。就是系統(tǒng)在運(yùn)行的時(shí)候的一些機(jī)制,其中最主要的是消息機(jī)制。
對(duì)于C語(yǔ)言,函數(shù)的調(diào)用在編譯的時(shí)候會(huì)決定調(diào)用哪個(gè)函數(shù)。編譯完成之后直接順序執(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ù)的名稱找 到對(duì)應(yīng)的函數(shù)來(lái)調(diào)用。
[obj makeText];
首先,編譯器將代碼[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í)行。
2.消息轉(zhuǎn)發(fā)(可以間接實(shí)現(xiàn)多重繼承)
當(dāng)向someObject發(fā)送某消息,但runtime system在當(dāng)前類和父類中都找不到對(duì)應(yīng)方法的實(shí)現(xiàn)時(shí),runtime system并不會(huì)立即報(bào)錯(cuò)使程序崩潰,而是依次執(zhí)行下列步驟:


1.動(dòng)態(tài)方法解析:向當(dāng)前類發(fā)送 resolveInstanceMethod: 信號(hào),檢查是否動(dòng)態(tài)向該類添加了方法。(迷茫請(qǐng)搜索:@dynamic)
2.快速消息轉(zhuǎn)發(fā):檢查該類是否實(shí)現(xiàn)了 forwardingTargetForSelector: 方法,若實(shí)現(xiàn)了則調(diào)用這個(gè)方法。若該方法返回值對(duì)象非nil或非self,則向該返回對(duì)象重新發(fā)送消息。
3.標(biāo)準(zhǔn)消息轉(zhuǎn)發(fā):runtime發(fā)送methodSignatureForSelector:消息獲取Selector對(duì)應(yīng)的方法簽名。返回值非空則通過(guò)forwardInvocation:轉(zhuǎn)發(fā)消息,返回值為空則向當(dāng)前對(duì)象發(fā)送doesNotRecognizeSelector:消息,程序崩潰退出。
這里只對(duì)2進(jìn)行代碼演示:意思是說(shuō),本類實(shí)現(xiàn)不了的方法,可以轉(zhuǎn)發(fā)給別的類去實(shí)現(xiàn)

- (id)forwardingTargetForSelector:(SEL)aSelector
{
class*other = [classnew];if([other forwardingTargetForSelector:aSelector]) {returnother;
}else{return[super forwardingTargetForSelector:aSelector];
}
}

)

這樣如果本類中沒(méi)有的方法,就會(huì)去class中嘗試查找,如果有,則返回class對(duì)象,讓其執(zhí)行,這樣就實(shí)現(xiàn)了快速消息轉(zhuǎn)發(fā)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Runtime簡(jiǎn)稱運(yùn)行時(shí),其中最主要的是消息機(jī)制 概述 C 與 OC 的不同 1.C 語(yǔ)言,函數(shù)的調(diào)用在編譯的時(shí)候...
    苦可樂(lè)閱讀 388評(píng)論 0 4
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,030評(píng)論 0 9
  • 消息機(jī)制是OC Runtime的一個(gè)重要機(jī)制 OC中的對(duì)象在調(diào)用方法時(shí),如[myObj testMethod:ar...
    Gekkko閱讀 987評(píng)論 0 3
  • 消息機(jī)制(Messaging) 不知大家有沒(méi)有想過(guò):我們?cè)诔绦蛑姓{(diào)用的方法,是怎么執(zhí)行的,又是怎么通過(guò)一個(gè)方法名字...
    百客閱讀 1,410評(píng)論 0 8
  • 連載第六 暗流涌動(dòng) 1. 晨晨媽從電梯里出來(lái),穿過(guò)樓梯間一直小跑到前臺(tái),飛快地按下指模,聽(tīng)得一聲滴地聲音,自己的工...
    周琦橞閱讀 580評(píng)論 21 22

友情鏈接更多精彩內(nèi)容