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

Ios 在Objective-C中将字符串转换/编译为可执行代码,ios,objective-c,reflection,objective-c-runtime,Ios,Objective C,Reflection,Objective C Runtime,我想在ObjC中获取一个字符串,并将其作为代码进行计算。例如(这些是由函数组成的): 我希望“Test”出现在输出日志中。我已经搜索和测试了很多代码示例和库,但仍然没有很好的结果 我最终得到了这两个库,以便在运行时进行编译: 1-libClang框架和clang_Cursor_求值函数 2-objc评估框架 我对利勃朗无能为力。现在还是这样,但是对于第二个,我成功地编译了框架,并在一个简单的项目中实际使用了它,但是仍然没有正确的输出 #import <Foundation/Found

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

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

我最终得到了这两个库,以便在运行时进行编译:

1-libClang框架和clang_Cursor_求值函数

2-objc评估框架

我对利勃朗无能为力。现在还是这样,但是对于第二个,我成功地编译了框架,并在一个简单的项目中实际使用了它,但是仍然没有正确的输出

#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");
}
#导入
#导入“OEEvaluation.h”
void main()
{
代码1:OEEvaluation*evaluation=[OEEvaluation evaluationWithCode:@“retun@\“Hello World!\”;“delegate:nil];
代码2://OEEvaluation*evaluation=[OEEvaluation evaluation with code:@“NSLog(@\“Hello World!\”);“代表:无];
NSLog([评估同步评估]);
NSLog(“测试”);
}
没有代码1和代码2的输出:无(空)、无错误、无提示。。什么都没有

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

也许我错了,但我认为我找到的解决方案与我的研究结果最接近

现在的问题是:

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

2-如何使objc-eval.framework工作

如何使objc-eval.framework工作

完整的源代码是可用的,请按您的方式完成它

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

您的第一个问题是tar’ed归档相当旧,需要更新最新版本的Xcode–Xcode提供了这样做的选项。完成这项工作后,项目将进行编译,但您会发现编译后的代码并不是此框架希望找到的代码–这是因为默认情况下,设置产品位置的项目设置在最新版本的Xcode中被覆盖

您需要研究Xcode的
首选项…
、项目的
生成位置设置、
xcodebuild
命令所采用的参数,以及框架中加载编译二进制文件的代码,以确定哪些设置将在您想要的位置获取编译二进制文件,以便框架可以访问它

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

玩得开心


HTH

答案中最重要的部分是最后一部分。你是说objc-eval.framwork不能在iphone设备上运行吗?因为没有安装Xcode???我需要这个项目在iphone设备上运行@CRD@Mrjm-正确,objc eval框架依赖于安装Xcode,其他选项libClang也是如此,因此在iOS下两者都不起作用。Objective-C通常是一种编译语言,即使你为它找到或编写了一个解释器,你也可能会发现苹果的iOS规则不允许它出现在发货应用程序中。我认为您需要重新评估您正在做的事情以及动态编译Objective-C的需求。@CRD谢谢,为我节省了很多时间-现在我正试图用Javascript实现这个想法。建立它小巧、干净、运行良好,但似乎只适用于简单的Js代码,无法访问本机代码和设备功能。有什么想法或建议吗?@Mrjm-iOS应用程序在沙箱中运行,JavaScript在沙箱中运行-试图让用户在飞行中访问“设备功能”听起来不适合这种模式。也许你应该再想想。也就是说JavaScript可以调用Objective-C和Swift。JavaScriptCore的文档很少,但花一些时间搜索web会发现一些示例。玩得高兴
#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");
}