OCEval

Objective-C 解释器
授权协议 未知
开发语言 C/C++ Objective-C
所属分类 程序开发、 其他开发相关
软件类型 开源软件
地区 国产
投 递 者 漆雕育
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

目前流行的 JSPatch/RN 基于JavaScriptCore提供了iOS的热修复和动态化方案。但是都必须通过下发Javascript脚本来调用Objective-C。 尤其是JSPatch,编写大量的JS代码来调用OC的方法,开发效率较低(目前可以借助语法转换器),运行效率也会打折扣。 更好的方案是直接编写Objective-C代码,来实现热修复或者动态化方案。开发效率更高,代码的执行效率也更高。

在python和javascript等脚本语言里,有类似eval()函数来直接动态执行代码。所以我实现了OCEval 这个库,让我们能直接动态执行Objective-C代码。例子如下:

NSString *inputStr = @"return 1 + 3 <= 4 && [NSString string] != nil;";
NSNumber *result = [OCEval eval:inputStr]; // result: @(YES)

为了实现跟JSPatch类似的热修复功能,增加了方法替换。我们就可以通过下发Objective-C代码进行现有App的方法替换,来进行热修复的功能。

//在新的imp里直接调用旧的方法实现
NSString *viewDidLoad2 = @"{\
[originalInvocation invoke];\
";

[OCEval hookClass:@"ViewController"
         selector:@"viewDidLoad"
         argNames:@[]
          isClass:NO
   implementation:viewDidLoad2];

OCEval甚至可以用来完整的编写一个页面或者App,并动态下发。我在iOS的Demo里实现了一个简单的页面,具体见源码。

  • OCEval 需求 目前流行的 JSPatch/RN 基于JavaScriptCore提供了iOS的热修复和动态化方案。但是都必须通过下发Javascript脚本来调用Objective-C。 尤其是JSPatch,编写大量的JS代码来调用OC的方法,开发效率较低(目前可以借助语法转换器),运行效率也会打折扣。 更好的方案是直接编写Objective-C代码,来实现热修复或者动态化方案。开发效率更

 相关资料
  • 模式定义 给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。 解释器模式的优点 解释器是一个简单语法分析工具, 它最显著的优点就是扩展性, 修改语法规则只要修改相应的非终结符表达式就可以了, 若扩展语法, 则只要增加非终结符类就可以了。 解释器模式的缺点 ● 解释器模式会引起类膨胀 ● 解释器模式采用递归调用方法 ● 效率问题 解释器模式的使用场景 ●

  • 问题内容: 我想在C / C ++应用程序中使用Node.js脚本。有人建议我从v8,libev和libeio开始。但这意味着从头开始重写Node.js。 因此,是否可以将Node.js嵌入C或C ++? 问题答案: 可能是,V8是用C 编写的,node.js可以在V8上运行,但是除非有 非常 好的理由要通过C 运行javascript ,否则最好为找到合适的C 库并直接实现所需的功能服务在C 中

  • 我在eclipse C上遇到了问题。我的项目编译并运行,但eclipse(juno)一直说有数千个错误。例如,我的代码中有一个函数SetRun,eclipse提到了这个错误:“被调用的无效参数”候选者是:void SetRun(?),而SetRun是静态无效SetRun(uint32_t run)类型; 我有很多类似的错误,其中eclipse似乎不理解函数的类型,而是放了一个'?'。 我也有很多这

  • 问题内容: 有没有办法在JVM上运行纯C代码? 不通过JNI连接运行,就像您可以通过JRuby运行ruby代码或通过Rhino运行javascript。 如果目前没有解决方案,您会建议我怎么做? 显然,我想使用尽可能多的局部解决方案来实现它。 ANTLR似乎是一个不错的起点,它具有完整的“ ANSI C”语法实现… 我应该使用ANTLR生成的代码在JVM上构建“玩具” VM吗? 问题答案: 201

  • 问题内容: 为简单起见,请设想这种情况,我们有一台2位计算机,它具有一对称为r1和r2的2位寄存器,并且仅适用于立即寻址。 假设位序列 00 表示 添加 到我们的CPU中。也 01 的装置将数据移动到R 1和 10组 的装置将数据移动到R2。 因此,这台计算机和一个汇编器都有一种汇编语言,其中的示例代码将像 简而言之,当我将此代码汇编成本地语言时,文件将类似于: 上面的12位是以下代码的本机代码:

  • 主要内容:1、单行注释,2、多行注释在 C# 中,注释通常用来对代码、变量、方法或类进行解释说明,注释中的内容不会被编译器编译,所以我们还可以借助注释来隐藏程序中不必要的代码。 C# 中的注释有两种类型: 单行注释; 多行注释。 1、单行注释 单行注释以 (双斜杠)开头,并且不需要任何结束符。需要注意的是,单行注释只对所在的行有效, 之后的内容才会被当作注释的内容, 之前的内容编译器会正常编译。 让我们看一下 C# 中单行注释的示例

  • 程序注释是可以包含在C ++代码中的解释性语句。 这些注释可以帮助任何人阅读源代码。 所有编程语言都允许某种形式的注释。 C ++支持单行和多行注释。 C ++编译器会忽略任何注释中可用的所有字符。 C ++注释以/ *开头,以* /结尾。 例如 - /* This is a comment */ /* C++ comments can also * span multiple lines

  • 程序的注释是解释性语句,您可以在 C++ 代码中包含注释,这将提高源代码的可读性。所有的编程语言都允许某种形式的注释。 C++ 支持单行注释和多行注释。注释中的所有字符会被 C++ 编译器忽略。 C++ 注释以 /* 开始,以 */ 终止。例如:/* 这是注释 */ /* C++ 注释也可以 * 跨行 */ 注释也能以 // 开始,直到行末为止。例如:#include <iostream> usi