首先說(shuō)一下什么是runtime:
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)用。
舉例說(shuō)明:
比如你[obj makeText];
則運(yùn)行時(shí)就這樣的:首先,編譯器將代碼[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í)行
已下是相關(guān)資料:http://blog.csdn.net/indulgein/article/details/51111472
http://zhidao.baidu.com/link?url=LZudyCopBr1cWuGZBOP-DXRXmunqV9BbIgyXvrhQgtriVDJn8VgPvDPxbfrPu17jc1ZvVSdASGYHn-8BrzILjSroZ01QYM2olYThamDeuf3
http://blog.csdn.net/mingge0107/article/details/50525220