在iPhone上运行时解释Objective C脚本?

时间:2010-04-27 17:03:12

标签: iphone objective-c runtime interpreter objective-c-runtime

无论如何在运行时加载一个目标c脚本,并针对当前iPhone应用程序中的classes / methods / objects / functions运行它?

主要注意: 我想做的主要原因是允许我快速建立应用程序原型,然后,在我之后做了一个主要的原型设计阶段,拿起我写的脚本,然后在构建时编译它们。我从来没有计划在其中发布带有客观c解释器的应用程序。

我问的原因是我一直在玩iPhone wax,一个可以嵌入到iPhone应用程序中的lua解释器,并且它的工作非常好,在任何对象/方法/功能的意义上您的Objective C代码中公开提供的内容将自动桥接,并在lua中提供。

这使您可以通过简单地将应用程序的核心设置为用户文档目录中的lua文件来快速构建应用程序原型。只需重新加载应用程序,您就可以测试对lua文件的更改,而无需在XCode中重建应用程序 - 节省大量时间!

但是,有了Apples最新的3.1.3 SDK的东西,它让我觉得做这种类型的快速原型的最安全的方法是,如果你可以使用Objective C作为解释代码......那样,最糟糕的情况,您可以在发布之前将其编译到您的应用中。我听说lua源代码可以编译成字节代码,并在构建时链接,但我认为最终安全的事情是如果脚本源是在客观c,而不是lua。这样,无论如何,您的来源始终是客观的。

如果有关于如何在iPhone应用程序中嵌入Objective C Interpreter的示例,这会让我想知道(我已经搜索过,但没有提出任何内容)?这将允许您根据二进制文件中内置的当前类快速构建应用程序原型,并且,当您即将部署应用程序时,而不是通过in app解释器运行类,而是编译它们。

使用iPad和OS 4,蓝牙和虚拟键盘可以与iPhone和iPad配合使用......这将使这种类型的快速原型制作更有用,至少在开发时间。例如,如果您的应用程序内置了解释器并将其放在iPad上,则可以在旅途中对解释器进行编码,而无需XCode。对我而言,将源恢复为“苹果批准”状态的最有用方法是脚本是否为目标C。

8 个答案:

答案 0 :(得分:3)

Objective-C实际上只是带有运行时和一些语法糖的C.它是一种固有的编译语言(我不认为有任何生产就绪的C语言解释器,尽管我可能错了)。

Xcode曾经有一个名为ZeroLink的功能来加快编译时间,但在Xcode 3中将其删除,因为它导致了太多错误。

答案 1 :(得分:3)

这并非完全不可能,但要值得这样做并不容易。 Objective-C通常不是解释性语言。这不是不可克服的 - 在大多数情况下,解释与编译只是一种实现选择。例如,Ruby传统上被认为是一种解释性脚本语言,但MacRuby将其编译为代码,就像Objective-C产生的那样。因此可以为Objective-C编写一个解释器,但没有人这样做。你必须自己写。

此外,规则禁止Apple的Javascript解释器以外的解释器。到目前为止,这还没有对任何人强制执行,但是如果你想要成为一个非常直的箭头,那么解释的代码也是不幸的。

答案 2 :(得分:2)

嗯,有一些值得提出的要点:

  1. 编译时,为什么解释 Objective-C代码?我理解“快速原型制作”的想法,但在Lua中这样做的部分原因是因为Lua是一种比Objective-C更为简洁的语言。我不知道解释Objective-C是否会获得多少奖金。
  2. 如果您希望在应用中使用插件或可动态加载的模块,您可以始终将它们编译为单独的捆绑包并使用NSBundle或类似机制加载它们。
  3. 所有这一切,我不知道任何Objective-C口译员。你可能不得不写自己的。我不确定它是否会违反Apple的指导原则:它仍然是Objective-C代码,但我认为它们也有针对解释代码的规则。 (我想他们从来没有想过会解释 Objective-C 的假设情景。)

答案 3 :(得分:1)

Ch是商业C / C ++解释器。它由一家名为SoftIntegration的公司制作。

答案 4 :(得分:1)

不在iPhone上,但在模拟器上,您可以使用
执行此操作 动态代码注入工具
http://dyci.github.com/

还有另一种工具,它的工作方式略有不同,但允许相同的功能 http://injectionforxcode.com/

答案 5 :(得分:1)

答案 6 :(得分:1)

你应该看看cycript。你可以挂钩应用程序,动态替换方法,更改变量,你可以命名它。它是Objective-C和JavaScript之间的混合语言。 您需要jailbreak您的iDevice才能安装它。

答案 7 :(得分:0)

查看objc_msgSend()的文档以及Objective-C Runtime Reference的其他部分。您基本上可以解析文本并将其发送到运行时。