首先說一下什么是runtime:
RunTime簡稱運行時。就是系統(tǒng)在運行的時候的一些機(jī)制,其中最主要的是消息機(jī)制慰丛。對于C語言,函數(shù)的調(diào)用在編譯的時候會決定調(diào)用哪個函數(shù)( C語言的函數(shù)調(diào)用請看這里 )瘾杭。編譯完成之后直接順序執(zhí)行诅病,無任何二義性。OC的函數(shù)調(diào)用成為消息發(fā)送粥烁。屬于動態(tài)調(diào)用過程贤笆。在編譯的時候并不能決定真正調(diào)用哪個函數(shù)(事實證明,在編 譯階段讨阻,OC可以調(diào)用任何函數(shù)苏潜,即使這個函數(shù)并未實現(xiàn),只要申明過就不會報錯变勇。而C語言在編譯階段就會報錯)。只有在真正運行的時候才會根據(jù)函數(shù)的名稱找 到對應(yīng)的函數(shù)來調(diào)用贴唇。
舉例說明:
比如你[obj makeText]搀绣;
則運行時就這樣的:首先,編譯器將代碼[obj makeText];轉(zhuǎn)化為objc_msgSend(obj, @selector (makeText));戳气,在objc_msgSend函數(shù)中链患。首先通過obj的isa指針找到obj對應(yīng)的class。在Class中先去cache中 通過SEL查找對應(yīng)函數(shù)method(猜測cache中method列表是以SEL為key通過hash表來存儲的瓶您,這樣能提高函數(shù)查找速度)麻捻,若 cache中未找到。再去methodList中查找呀袱,若methodlist中未找到贸毕,則取superClass中查找。若能找到夜赵,則將method加 入到cache中明棍,以方便下次查找,并通過method中的函數(shù)指針跳轉(zhuǎn)到對應(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