JSPatch原理

参考网址:

JSPatch官方原理说明:

https://github.com/bang590/JSPatch/wiki/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的一些数据结构和方法:

数据结构:

http://blog.ibireme.com/2013/11/26/objective-c-messaging/

方法:

动态调用方法:

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)大体用到的东西都已经遇到过了。另外还有一些内存等问题等,见官博。

转载于:https://www.cnblogs.com/zhang-chi/p/6179791.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值