JSPatch觀后感

覆蓋函數(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是否存在。)

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

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

  • 轉(zhuǎn)載:原文鏈接 http://blog.cnbang.net/tech/2808/ JSPatch以小巧的體積做到...
    made_China閱讀 427評論 0 0
  • http://blog.cnbang.net/tech/2808/ JSPatch實現(xiàn)原理詳解 注:本文較早撰寫,...
    hypercode閱讀 1,369評論 0 1
  • 1.項目經(jīng)驗 2.基礎(chǔ)問題 3.指南認識 4.解決思路 ios開發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    扶光啟玄閱讀 5,202評論 0 13
  • 今天曬曬老媽,老媽的脾氣性格已經(jīng)接近老頑童了,讓人歡喜讓人憂,不高興的時候根本不會考慮別人的感受,說話...
    艷青閱讀 462評論 3 2
  • 美好的一天從感恩開始!我感恩生命的富足美好!讓我可以自在的生活。我感恩健康!讓我可以無憂的生活。我感恩天氣!昨天接...
    淘淘的簡書閱讀 94評論 0 0

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