在Objective-C中将字符串转换/编译为可执行代码

时间:2017-10-24 07:45:34

标签: ios objective-c reflection objective-c-runtime

我想在ObjC中取一个字符串并将其评估为代码。例如(这些是补偿函数):

NSString *Cmd=@" if (10>5) NSLog(@"Test");  ";
MyClass.Run(Cmd);

我希望输出日志中出现“Test”。我搜索并测试了很多代码示例和库,但仍然没有很好的结果。

我结束了这两个库在运行时进行编译:

1- libClang框架和clang_Cursor_Evaluate函数。

https://www.mikeash.com/pyblog/friday-qa-2014-01-24-introduction-to-libclang.html

https://github.com/root-project/cling

2- objc-eval框架。

https://github.com/antipax/objc-eval/blob/master/README.mdown

我对libClang无能为力。并保持现状,但是第二个,我成功编译了框架并实际在一个简单的项目中使用它,但仍然没有正确的输出!

#import <Foundation/Foundation.h>
#import "OEEvaluation.h"
void main()
{
Code1:OEEvaluation *evaluation = [OEEvaluation evaluationWithCode:@"retun @\"Hello World!\" ;" delegate:nil];
Code2://OEEvaluation *evaluation = [OEEvaluation evaluationWithCode:@"NSLog(@\"Hello World!\");" delegate:nil];
NSLog([evaluation evaluateSynchronously]);
NSLog(@"Test");
}

没有Code1和Code 2的输出:no(null),没有错误,没有提示..什么都没有。

代码1是框架文档中的确切示例。

也许我错了,但我认为我找到的解决方案与我的研究之间的答案最接近。

现在的问题是:

1-如何实现这个想法(将字符串转换为可执行代码的可执行行)?

2-如何让objc-eval.framework工作?

1 个答案:

答案 0 :(得分:2)

  

如何让objc-eval.framework工作?

完整的资源可用,通过它。

您将发现它通过将其拼接到一个Xcode项目来运行您的代码,该项目是通过解压缩tar存档,调用xcodebuild来编译该项目,然后动态加载已编译的代码和执行它。

你的第一个问题是tar'ed存档相当陈旧,需要更新最新版本的Xcode - Xcode提供了执行此操作的选项。完成后,项目将编译但你会发现编译的代码不是这个框架期望找到它的地方 - 这是因为默认情况下,设置产品位置的项目设置在最新版本的Xcode中被覆盖。 / p>

您需要探索Xcode的Preferences…,项目的Build Locations设置,xcodebuild命令所采用的参数,以及框架中加载已编译二进制文件以确定哪些设置的代码获取所需的编译二进制文件,以便框架可以访问它。

一旦你这样做,你会发现框架有效。请注意,要实现此功能,需要在运行应用的任何系统上安装Xcode。

玩得开心!

HTH