我想在 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/