JSPatch原理
参考网址:
JSPatch官方原理说明:
源码分析简书:
http://www.jianshu.com/p/69f7623c13b7
http://www.jianshu.com/p/3d9a1c53016a
一.基础知识:
1.js和OC互调,JavaScriptCore
http://www.jianshu.com/p/a329cd4a67ee
2.OC Runtime的一些数据结构和方法:
数据结构:
方法:
动态调用方法:
Class class = NSClassFromString("UIViewController");
id viewController = [[class alloc] init];
SEL selector = NSSelectorFromString("viewDidLoad");
[viewController performSelector:selector];
替换某个类的方法为新的方法:
static void newViewDidLoad(id slf, SEL sel) {}
class_replaceMethod(class, selector, newViewDidLoad, @"");
新注册一个类,为类添加方法:
Class cls = objc_allocateClassPair(superCls, "JPObject", 0);
objc_registerClassPair(cls);
class_addMethod(cls, selector, implement, typedesc);
根据名字返回一个selector
SEL selector = NSSelectorFromString(@"ViewDidLoad");
获得一个类的一个selector的IMP
class_getMethodImplementation(cls, selector)
3.消息转发机制和_objc_msgForward
http://www.cocoachina.com/ios/20150604/12013.html
http://blog.ibireme.com/2013/11/26/objective-c-messaging/
二.JSPatch实现热修复的大体流程
1.为什么要使用一个脚本语言
如果要让你从零实现一个iOS的热修复机制,你会怎么做。能想到的:
1.肯定是服务器下发一对字符串,这些字符串是按照协议好的规则,表示了一下一些热修复的场景:方法替换、增加方法、增加property、self关键字、block、dispatch_async_main。。。。试想你不借助任何变成语言,描述下把HMLittleHomeVC的ViewDidLoad替换成一个别的方法(这个“别的方法”当然也不用已有的语言来描述,那你得重新定义变量、重新定义循环、定义if else),如果不借助一个已经存在的编程语言,你要实现热修复这些功能,差不多得重新实现一门语言。所以必须借助一个已有的语言。
2.为什么不直接用OC、为什么js,没有方法能让iOS运行一段OC代码(字符串)。。。
3.为什么是js:首先满足2,因为我们可以在OC里执行一段js代码的自渡船,学习成本、小巧、最重要的是通过JavaScriptCore能够实现和OC的灵活的互相调用,可以相互传递参数。
2.大体思想
JSPatch的作者这样说JSPatch的基本原理
所以 JSPatch 的基本原理就是:JS 传递字符串给 OC,OC 通过 Runtime 接口调用和替换 OC 方法。这是最基础的原理,实际实现过程还有很多怪要打,接下来看看具体是怎样实现的。
这样说是没错,不过想补充一点:也是刚开始我理解有问题的一点:JSPatch并非在运行一开始,就通过js代码把该改变的东西都改变了,就没js什么事了,其实是根据用户传入的字符串(js代码),生成了一些js函数、配合上自带的一些js函数,然后呆在那等待着被调用,例如这段代码,是把HMLittleHomeVC的tableView:didSelectRowAtIndexPath方法替换成我们自己定义的方法(用第三方库,弹出一个alert)。
require('PXAlertView')
defineClass("HMLittleHomeVC", {
tableView_didSelectRowAtIndexPath: function(tableView, indexPath) {
PXAlertView.showAlertWithTitle('jspatch');
},
})
其实JSPatch做的事情是,生成一个新的方法,新的方法最主要的内容,是调用一段js代码,这段js代码的某几句,是回调OC代码,而且原OC方法tableView:didSelectRowAtIndexPath的实现指向了新的方法(实际上不是单纯的指向,可以先这样么理解)。
三.源码解读
四.项目中关于JSPatch的使用。
五.剩余内容
到这里JSPatch的最主要的思想已经过了一遍,还有些未提到的关于热修复遇到的功能,或者js在实现OC方法时遇到的关键字(self、super)大体用到的东西都已经遇到过了。另外还有一些内存等问题等,见官博。