在编译时块会发生什么,我可以在运行时创建一个块吗?

Phi*_*hil 2 introspection objective-c objective-c-blocks

这是关于Objective-C中(^ {})的两部分问题.我已经搜索了一些答案,但没有任何内容出现在Google或SO中.这个问题源于为iOS创建自定义XML Layout Engine的愿望,支持块 - 这意味着我想解析NSStrings并在运行时创建一个块.

1)这甚至可能吗?如果是这样,怎么办呢?

无法找到太多NSString to Block,我认为原因可能是编译器如何处理一个块 - 所以我再次搜索一个答案,但空手而归.所以:

2)在Objective-C编译时块发生了什么?

bbu*_*bum 5

一个块是两件事; 执行经过块时捕获的大量可执行代码和状态.

即给出:

 myBlock = ^{ return someVariable + someOtherVariable; };
Run Code Online (Sandbox Code Playgroud)

编译时,这会创建一个代码块,其行为非常类似于将两个变量一起添加的函数返回结果.没有创建块实例.

执行时,在计算表达式时myBlock = ^{...};,将创建块实例.内部的块实例的引用,编译器产生的代码,并包含在两个变量的值的副本当时的分配myBlock作出的(除非,当然,__block是在玩,等...).

这回答(2),但与回答(1)有关.

在运行时,您可以整天创建现有的,已编译的块的实例.但是,您不能创建新类型的块.这样做需要编译器,并且仅限于编译新的可执行代码并实际执行它的运行时环境.