在每個(gè)類中都有一個(gè)Dispatch Table奸晴,這個(gè)Dispatch Table本質(zhì)是將類中的SEL和IMP(可以理解為函數(shù)指針)進(jìn)行對(duì)應(yīng)适袜。而我們的Method Swizzling就是對(duì)這個(gè)table進(jìn)行了操作欢峰,讓SEL對(duì)應(yīng)另一個(gè)IMP。
==================
對(duì)象如何找到對(duì)應(yīng)的正確方法去調(diào)用:
對(duì)象方法保存在類中,類方法保存在元類中;
每一個(gè)類都有一個(gè)方法列表:method list;
(1) 明確去哪個(gè)類中調(diào)用方法;通過(guò)對(duì)象的isa指針,這個(gè)指針指向的就是這個(gè)實(shí)例對(duì)象的類對(duì)象;
(2) 根據(jù)傳入的方法編號(hào),也就是SEL編號(hào),去方法列表中查找到對(duì)應(yīng)的方法;
為什么蘋果會(huì)使用方法編號(hào)?因?yàn)椴僮鲾?shù)字比操作字符串會(huì)快,那么傳遞方法的時(shí)候傳遞數(shù)字編號(hào)會(huì)提高效率;
(3) 根據(jù)方法編號(hào)找到了方法名(函數(shù)入口),然后根據(jù)這個(gè)方法名去內(nèi)存中的方法區(qū)找到這個(gè)函數(shù)的實(shí)現(xiàn)!!!