覆蓋函數(shù)
1一開始把js調(diào)用代碼a.test()從變成a.__c(“test”)()統(tǒng)一函數(shù)入口
2 使用context獲取調(diào)用defineclass時候的參數(shù)拆解成類名,函數(shù)名,js代碼,把js執(zhí)行代碼放入dic[類名][函數(shù)名],并把函數(shù)IMP指向_objc_msgForward讓函數(shù)進入方法轉(zhuǎn)發(fā)流程并把ForwardInvocation的IMP指向JPForwardInvocation(以便獲取原來的函數(shù)參數(shù)類型)
3 當函數(shù)執(zhí)行的時候進入方法轉(zhuǎn)發(fā),進入JPForwardInvocation。通過方法簽名獲取原來函數(shù)名然后通過dic[類名][函數(shù)名]獲取到對應(yīng)的js代碼。
4 執(zhí)行代碼。
執(zhí)行代碼
1 在一開始加載代碼時js代碼的時候如a.alloc.init會正則替換成A.__c(“alloc”)().__c(“init”)()。
2 執(zhí)行A.__c(“alloc”)()時候在js的__c方法里面獲取函數(shù)名alloc以及其參數(shù),并傳給_methodFunc函數(shù)最終調(diào)用_OC_callC(類方法)。
3 context截取_OC_callC方法并根據(jù)類名和函數(shù)名參數(shù)運行并返回一個實例變量地址address。
4 把實例變量地址__obj以及類名通過context傳回給js,現(xiàn)在js代碼相當于__obj.__c(“init”)()。
5 再次在__c方法里面獲取函數(shù)名alloc以及其參數(shù),并傳給_methodFunc函數(shù)最終調(diào)用_OC_callI(實例方法)。
6context截取_OC_callI方法并根據(jù)實例名和函數(shù)名參數(shù)運行。
(注:里面判斷是否實例變量是通過判斷__obj是否存在。)