这是一个关于 Objective-C 中的 block (^{}) 的两部分问题。我已经搜索了一些答案,但谷歌或 SO 中没有显示任何内容。这个问题源于为 iOS 创建一个自定义 XML 布局引擎的愿望,并支持 block - 这意味着我想在运行时解析 NSString 并创建一个 block 。
1)这可能吗?如果可以的话,该怎么办?
在 NSString to Block
上找不到太多内容,我认为原因可能是编译器处理 block 的方式 - 所以我再次寻找答案,但空手而归。所以:
2) Objective-C 中的编译时 block 会发生什么?
最佳答案
一个 block 是两件事;当执行通过 block 时捕获的一大块可执行代码和状态。
即给定:
myBlock = ^{ return someVariable + someOtherVariable; };
编译时,这会创建一段代码,其行为非常类似于将两个变量相加并返回结果的函数。没有创建 block 实例。
执行时,当计算表达式myBlock = ^{...};
时,就会创建一个 block 实例。该 block 实例内部是对编译器创建的代码的引用,以及对 myBlock
赋值时两个变量中包含的值的副本(除非,当然,__block
正在发挥作用,等等...)。
这回答了 (2),但与回答 (1) 相关。
在运行时,您可以全天创建现有的、已编译的 block 的实例。但是,您无法创建新种类的 block 。这样做需要编译器,并且仅限于可以编译新的可执行代码并实际执行它的运行时环境。
关于objective-c - 编译时 block 会发生什么?我可以在运行时创建一个 block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16323089/