美文网首页iOS - 毕业论文
关于JSPatch的一些总结

关于JSPatch的一些总结

作者: iCotton | 来源:发表于2016-03-16 18:09 被阅读343次

原理基础

  • JSPatch 之所以能做到通过 JS 调用和改写 OC 方法最根本的原因是 Objective-C 是一门动态语言,OC 上所有方法的调用/类的生成都是通过 Objective-C Runtime 在运行时进行。JS 传递字符串给 OC,OC 通过 Runtime 接口调用和替换 OC 方法。
通过类名/方法名反射得到相应的类和方法
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);

注:Runtime是开源的

框架图

<br />

我理解的框架图.png

通过下面一段简单的代码来解释以下上面这个框架图的含义

require('UIView')
var view = UIView.alloc().init()
view.setBackgroundColor(require('UIColor').grayColor())
view.setAlpha(0.5)

require其实就是下面这么一个js函数

var _require = function(clsName) {
    if (!global[clsName]) {
            global[clsName] = {
                 __isCls: 1,
                 __clsName: clsName
            }
        }
     return global[clsName]
}

它在全局作用域生成了 UIView 这个变量,指向一个这样一个对象:

{
    __isCls: 1,
    __clsName: "UIView"
}

下面来看看UIView.alloc().init()是怎么被oc执行到的

  • 执行之前会该段js代码会被替换如下:
UIView.alloc().init()
->
UIView.__c('alloc')().__c('init')()
  • 我们看到__c()这个函数,他是哪来的呢,干什么的呢?我觉得作者的这一步的算是这个框架的点睛之笔了,__c()函数原型是这样的:
Object.prototype.__c = function(methodName) {
       if (!this.__obj && !this.__clsName)
           return this[methodName].bind(this);
       var self = this
       return function(){
           var args = Array.prototype.slice.call(arguments)
           return _methodFunc(self.__obj, self.__clsName, methodName, args, self.__isSuper)
       }
}
  • Object是JS对象的基类,给Object的prototype加上__c成员,这样所有对象都可以调用到__c
  • _methodFunc这个函数的作用就是把相关信息传给OC,OC用 Runtime接口调用相应方法并返回结果值

到此js->oc的这条路就走通了,JSPatch,接下来可能就是一些Runtime上细节的处理了,比如:消息传递,对象持有/转换,类型转换,方法新增,发放替换,self关键字,super关键字等等这些的实现,其中主要的技术手段都是Objective-Runtime(这是是开源的可以看看)。

未完待续~

风险

平台

相关文章

  • 关于JSPatch的一些总结

    原理基础 JSPatch 之所以能做到通过 JS 调用和改写 OC 方法最根本的原因是 Objective-C 是...

  • 初识 JSPatch

    前言说明: 前段时间看新浪微博的一些文章,有位叶大神提到 JSPatch 的作者和一些关于 JSPatch 的...

  • 关于JSPatch的学习

    最近JSPatch挺火的,于是抽时间学习一下留着备用在网上查询了不少关于JSPatch的文章,总结下来有两种不同的...

  • 关于JSPatch的一些坑

    发出去的app 出现bug 鞭长莫及?有热修复的出现再也不用担心了。可以在客户还没发现就偷偷的把bug修复了。JS...

  • JSPatch 浅探

    前言 JSPatch下载地址自己实现JSPatch的功能 修改JSPatch JSPatch简介 JSPatch ...

  • IOS关于热修复JSPatch

    一:关于JSPatch JSPatch : 是一个iOS动态更新框架,只需在项目中引入极小的引擎,就可以使用Jav...

  • JSPatch使用总结

    项目中集成了JSPatch,用到过几次,现在就把OC代码转JS代码的一些注意点写出来,也是为了让自己以后用到的时候...

  • JSPatch使用 私有变量操作

    基本使用 ** JSPatch 官方平台 ** ** JSPatch 语法转换 ** JSPatch基本使用 JS...

  • JSPatch忽略的点

    JSPatch可以帮助我们不需要发版的情况,修复一些线上简单的问题。所以当它出现后,瞬间得到了传播。JSPatch...

  • 被JSPatch平台私有API验证误杀了

    经过上次JSPatch被封杀事件之后,JSPatch平台做了一些安全性的提高,没想到今天就中枪了。提交的补丁中有一...

网友评论

  • 让周飞:这里讲了通过jspatch将js代码进行了转换,将js方法调用转换成统一的_c调用,原方法名跟类名以及方法调用参数作为_c的参数传入,_c内部又调用了oc提供的_methodFunc方法(这里的_methodFunc是oc提供给jscore调用的没错吧?因为我没看到定义)透传了_c的参数,最终oc调用runtime提供的方法去执行原生调用,这样就实现了用js调用oc原生方法。问题是,怎么去替换或新增原生方法呢?这个新的方法是js语法写的然后jspatch再转换一次?这里不是很理解,请教下:smile:
    iCotton:@让周飞 这个问题你可以看看JSPatch中defineClass的实现就明白了

本文标题:关于JSPatch的一些总结

本文链接:https://www.haomeiwen.com/subject/penqlttx.html