【问题标题】:Objective-C dynamically define a method at runtime via a stringObjective-C 在运行时通过字符串动态定义方法
【发布时间】:2014-07-24 09:03:27
【问题描述】:

看了几篇博文,搜了一下SO,我知道怎么给类添加方法了,但是没有人提到怎么从String中定义方法体。

这是一个接近我想要做的示例博客文章:

http://theocacao.com/document.page/327

但是,SayHello 方法仍然需要在目标 C 代码中。理想情况下,我会有类似的东西:

IMP myMethod = class_addMethodFromString(@"method definition goes here...");

我也看过这里:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/c/func/method_setImplementation

【问题讨论】:

  • 有什么可能,但这不是很清楚。您可以添加一个 sn-p 来展示您希望能够在代码中编写的内容吗?
  • 是的,请参阅编辑后的答案。
  • 好吧,那是不可能的。或者至少可能不值得麻烦。实际上,您可以使用字符串作为输入调用编译器,然后动态加载结果。
  • Running arbitrary code at runtime 的可能副本,另请参阅 Eval in ObjC
  • 我猜是通过system()NSTaskdlopen() 调用编译器生成的文件。我从未尝试过。

标签: objective-c metaprogramming metaclass


【解决方案1】:

我不相信这是可能的。 Objective C 需要被编译,所以除非你能编译你从那个字符串得到的代码,否则我认为这是不可能的。 setImplementation 方法允许您指向现有的已编译代码块。

如果您真的想要,并且您正在运行的代码由您决定,您可以执行您在 UIWebView 中以字符串格式收到的 javascript(不必添加到视图中,您只需要一个例子,我相信)。

您也可以故意在代码中导致缓冲区溢出,然后以这种方式执行任意命令,但同样,您将在已编译的环境中运行,并且需要知道您希望的代码的内存地址执行。

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多