OCEvalObjective-C 解釋器
目前流行的 JSPatch/RN 基于JavaScriptCore提供了iOS的熱修復和動態(tài)化方案。但是都必須通過下發(fā)Javascript腳本來調(diào)用Objective-C。 尤其是JSPatch,編寫大量的JS代碼來調(diào)用OC的方法,開發(fā)效率較低(目前可以借助語法轉(zhuǎn)換器),運行效率也會打折扣。 更好的方案是直接編寫Objective-C代碼,來實現(xiàn)熱修復或者動態(tài)化方案。開發(fā)效率更高,代碼的執(zhí)行效率也更高。
在python和javascript等腳本語言里,有類似eval()函數(shù)來直接動態(tài)執(zhí)行代碼。所以我實現(xiàn)了OCEval 這個庫,讓我們能直接動態(tài)執(zhí)行Objective-C代碼。例子如下:
NSString *inputStr = @"return 1 + 3 <= 4 && [NSString string] != nil;"; NSNumber *result = [OCEval eval:inputStr]; // result: @(YES)
為了實現(xiàn)跟JSPatch類似的熱修復功能,增加了方法替換。我們就可以通過下發(fā)Objective-C代碼進行現(xiàn)有App的方法替換,來進行熱修復的功能。
//在新的imp里直接調(diào)用舊的方法實現(xiàn)
NSString *viewDidLoad2 = @"{\
[originalInvocation invoke];\
";
[OCEval hookClass:@"ViewController"
selector:@"viewDidLoad"
argNames:@[]
isClass:NO
implementation:viewDidLoad2];
OCEval甚至可以用來完整的編寫一個頁面或者App,并動態(tài)下發(fā)。我在iOS的Demo里實現(xiàn)了一個簡單的頁面,具體見源碼。
評論
圖片
表情
