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

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

我想在 ObjC 中获取一个字符串并将其作为代码进行计算。例如(这些是虚构的函数):

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

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

我最终得到了这两个在运行时编译的库:

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");
}

代码 1 和代码 2 无输出:无(空)、无错误、无提示……什么都没有。

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

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

现在的问题是:

1- 我怎样才能实现这个想法(将字符串转换为可执行代码的可执行行)?

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

最佳答案

How can I get the objc-eval.framework to work?

完整的源代码可用,请按您的方式使用。

你会发现它运行你的代码是通过将它拼接到一个 Xcode 项目中来运行的动态加载编译后的代码并执行。

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

您需要探索 Xcode 的 Preferences...、项目的 Build Locations 设置、xcodebuild 命令采用的参数以及加载已编译二进制文件的框架,以决定哪些设置会将已编译二进制文件获取到您想要的位置,以便框架可以访问它。

完成后,您会发现该框架可以正常工作。请注意,要使其正常工作,需要在您的应用程序运行的任何系统上安装 Xcode。

玩得开心!

HTH

关于ios - 在 Objective-C 中将字符串转换/编译为可执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46904904/

相关文章:

iOS 9 - CSSearchableItem 的 "domainIdentifier"

html - 如何使用 Xcode 动态修改 HTML?

c# - 具有覆盖属性和反射的奇怪效果

javascript - ios 13 DeviceOrientationEvent.requestPermission : how to force device to ask again for user permission

ios - 我如何使用 Asset url 获取图像或视频文件的 NSData

ios - Xcode - "Could not launch <AppName>” ,没有那个文件或目录错误

java - 自动类型转换和填充POJO

c# - 获取对象实例上自定义属性的*值*?

javascript - UIWebview 如何在 iOS 中进行渲染?

objective-c - 方法创建一个包含 11 个对象的数组,全部超出范围,无法识别的选择器结果