【问题标题】:Convert/compile a string into executable code in Objective-C在 Objective-C 中将字符串转换/编译为可执行代码
【发布时间】: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


    【解决方案1】:

    如何让 objc-eval.framework 工作?

    完整的源代码可用,请按照自己的方式进行操作。

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

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

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

    一旦你这样做了,你会发现框架是有效的。请注意,要使其正常工作,您需要在运行您的应用程序的任何系统上安装 Xcode。

    玩得开心!

    HTH

    【讨论】:

    • 答案中最重要的部分是最后一部分。您的意思是 objc-eval.framwork 不适用于 iphone 设备吗?因为没有安装 Xcode???我需要这个项目在 iphone 设备上运行。 @CRD
    • @Mrjm - 正确,objc-eval 框架依赖于安装 Xcode,您的其他选项 libClang 也是如此,因此两者都无法在 iOS 下运行。 Objective-C 通常是一种编译语言,即使您为它找到或编写了解释器,您也可能会发现 Apple 的 iOS 规则不允许它在发布应用程序中使用。我认为你需要重新评估你在做什么以及你对动态编译 Objective-C 的要求。
    • @CRD-thanks,为我节省了很多时间——现在我试图用 Javascript 来实现这个想法。找到github.com/evgenyneu/ios-javascriptcore-demo。它的小,干净,好并且运行良好,但它似乎仅适用于简单的 Js 代码,并且无法访问 Native Codes 和设备功能。有什么想法或建议吗?
    • @Mrjm - iOS 应用程序在 sandbox 中运行,JavaScript 在 sandbox 中运行 - 试图让用户即时访问“设备功能”听起来不适合这个模型。也许你应该再想一想。也就是说 JavaScript 可以调用 Objective-C 和 Swift。 JavaScriptCore 的文档很少,但花一些时间在网上搜索会找到示例。玩得开心!
    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多