是否可以将objective-c块保存到文件中,然后从那里读取它以使用它?

时间:2013-11-27 11:54:32

标签: objective-c heap objective-c-blocks

我想将一个objective-c块保存到文件(或任何其他存储器,例如FTP服务器),然后从那里加载并执行它。

Blocks Programming Guide > Using Blocks > Copying Blocks,我知道块可以存储在堆中。因为存储在那里的任何东西都可以修改,我认为可以从堆中读取和写入任意内容,并将数据视为块。

我的问题是,如何将块保存到文件中?我甚至不知道它的结构是什么/它涵盖了多少字节。我非常怀疑做一个sizeof()然后读/写多个字节就足够了。请帮助我找到开始从内存中读取和写入块并开始理解它们的组成方式。

让我们从这段代码开始:

void (^myBlock)(void) = ^{ printf("Hello, I'm a Block\n"); };    
printf("block size: %lu\n", sizeof(myBlock));
myBlock();

输出:

block size: 4
Hello, I'm a Block

可以想象,如果这样可行,可以在iOS中实现一长串有趣的概念。仅举几例:

  • 即时从Web下载可执行代码(作为块),将其存储在堆中并执行它,从而使iOS中的动态链接库成为可能。从这个想法出发,产生了更多的可能性,这些可能性太多而无法在这里写出来。
  • 在应用程序中编译代码并立即执行,从而在iOS应用程序中启用任何类型的本机执行脚本语言。
  • 在iOS中的计算机级别上运行时操作代码。这是AI和进化/随机算法的一个重要主题。

2 个答案:

答案 0 :(得分:2)

块对象可以存储在堆中。但是块对象本身和其他对象一样,不包含可执行代码 - 它只包含捕获的变量,一些元数据和指向执行的底层函数的指针。即使您可以假设序列化块对象,也只能在已实现相同块的系统上对它们进行反序列化,即具有相同的可执行代码。

要进行类比,你所说的同样适用于普通的Objective-C对象 - 堆上存在Objective-C对象,可以序列化许多Objective-C对象,而Objective-C对象包含可执行的“方法” “你可以打电话给他们。这是否意味着您可以“即时”从Web下载可执行代码(作为对象),将其存储在堆中,并在其上调用方法,从而在iOS中实现动态链接库。“?当然不是。您只能对具有相同类的系统上的对象进行反序列化。

答案 1 :(得分:0)

不可能: 当您在堆上复制块时,您正在复制块本身的地址,而不是块的代码。 此外,运行未编译和签名代码的可能性违反了沙盒的概念,并且它打开了在您的应用程序中运行恶意代码破坏安全性的可能性。 您可以在应用程序中实现自定义语言解释程序以运行interpred代码,但这将违反Apple策略,并且在审核过程中将被拒绝。