【问题标题】:Is it possible to save an objective-c block to a file and later read it from there to use it?是否可以将objective-c 块保存到文件中,然后从那里读取以使用它?
【发布时间】:2013-12-13 01:19:07
【问题描述】:

我想将 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 的机器级别上操作代码。这是人工智能和进化/随机算法的重要主题。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 你是对的,可执行代码保留在 RAM 的代码区域中,尝试修改它会导致 EXC_BAD_ACCESS。只有块参数在可写内存区域中传递。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多