【发布时间】:2017-10-24 07:45:34
【问题描述】:
我想在 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");
}
Code1 和 Code 2 没有输出:没有(null)、没有错误、没有提示……什么都没有。
代码 1 是框架文档中的确切示例。
也许我错了,但我认为我找到的解决方案是我研究中最接近答案的解决方案。
现在的问题是:
1- 我怎样才能实现这个想法(将字符串转换为可执行代码的可执行行)?
2- 如何让 objc-eval.framework 工作?
【问题讨论】:
标签: ios objective-c reflection objective-c-runtime