iOS - 毕业论文

关于JSPatch的一些总结

2016-03-16  本文已影响343人  iCotton

原理基础

通过类名/方法名反射得到相应的类和方法
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执行到的

UIView.alloc().init()
->
UIView.__c('alloc')().__c('init')()
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)
       }
}

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

未完待续~

风险

平台

上一篇 下一篇

猜你喜欢

热点阅读