jspatch 的简单原理理解

作者:Love@YR 

链接:http://blog.csdn.net/jingqiu880905/article/details/51017142

请尊重原创,谢谢!

入口

 [JPEngine startEngine];
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"];
    NSString *script = [NSString stringWithContentsOfFile:sourcePath encoding:NSUTF8StringEncoding error:nil];
    [JPEngine evaluateScript:script];

1.把需要运行的demo.js用正则表达式转换一下

static NSString *_regexStr = @"(?<!\\\\)\\.\\s*(\\w+)\\s*\\(";
static NSString *_replaceStr = @".__c(\"$1\")(";
 NSString *formatedScript = [NSString stringWithFormat:@";(function(){try{\n%@\n}catch(e){_OC_catch(e.message, e.stack)}})();", [_regex stringByReplacingMatchesInString:script options:0 range:NSMakeRange(0, script.length) withTemplate:_replaceStr]];
    @try {
        if ([_context respondsToSelector:@selector(evaluateScript:withSourceURL:)]) {
            return [_context evaluateScript:formatedScript withSourceURL:resourceURL];
        } else {
            return [_context evaluateScript:formatedScript];
        }
    }

这样转变之后方法的调用变成_c(‘methodName’)

2.如何知道一个js对象为oc类?

 调用(global.require)_require方法为这个js对象加个key:_isCls 并保存类名_clsName

 

3.如何知道一个js对象为oc对象

js对象的key _obj对应的值便是oc对象返回的指针,如果是oc类则没有这个key。这个key是oc调用了方法后再包装传给js的

 

4.如何表示一个js对象为oc某个对象的父类对象

js对象的key _isSuper如果为1则是其父类

 

3.如何调用方法

 

Object.prototype.__c

 

  js的对象基类加一个_c成员方法。这个方法说明如果此对象有_obj(代表其是oc对象转来的js对象)或者_clsName(代表其是oc类的对象)则告诉它要去调用oc方法。(否则就是普通的js绑定方法)。

 

如果调用的方法名为super则直接返回这个js对象设置其_isSuper为1

 

var args = Array.prototype.slice.call(arguments)

拿到参数(参数怎么拿到的不懂)

 

然后把_obj即包装过的oc方法返回的指针对象,类名,方法名,

var _methodFunc = function(instance, clsName, methodName, args, isSuper)

 

经过一系列动作拿到了方法的selectorName, 然后根据instance即_obj有无值选择调用_OC_callI或者_OC_callC 

 

 

4. 看一下js是如何让oc方法执行的

 

首先app启动时开启了js 引擎,创建了js的运行环境,并定义了几个方法,这些方法可以直接被js调用。(说的是调用这些方法时js参数类型和oc可以互转)

 

以_OC_callI为例,分析下其所做的动作。

 

 

调用callSelector:

 

拿到是不是实例,是不是基础类型,拿到参数,拿到selector,然后invocation设置target ,设置selector ,拿到参数的类型指针设置参数,然后invoke执行方法调用,然后拿到returnValue,再把returnValue从oc对象指针放入dictionary中然后return回js。

js里 var ret = instance ? _OC_callI(instance, selectorName, args, isSuper):

                         _OC_callC(clsName, selectorName, args)

的ret即为返回。

然后再把这个dictionary转成的object转成js

 

就比如 require('UILabel').alloc().init();

 

这样就完成了js里调用_c(‘alloc’)-oc调用方法-oc返回结果(UILabel的对象指针)给js-js再把结果转成js对象-再调用_c(‘init’)方法

 

5.看一下js如何让oc重新定义某个方法的实现的

_OC_defineClass

没有此类,则注册一个,有的话则调overrideMethod,这个方法完全就是方法重组的案例。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值