objective-c - 编译时 block 会发生什么?我可以在运行时创建一个 block 吗?

标签 objective-c objective-c-blocks introspection

这是一个关于 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/

相关文章:

iphone - 从视频创建缩略图 - 提高速度性能 - AVAsset - iPhone

ios - 该应用程序正在从后台线程修改自动布局引擎。

ios - UITableView如何操作队列并发下载

linux - 在 FreeBSD v8.1 上/proc/cpuinfo 是什么?

iphone - 在默认的 UIScrollView 平移手势识别器中检测 UIGestureStateEnded

ios - 如何检测点击 UITableView 的清晰部分?

objective-c - Block 如何捕获其封闭范围之外的变量?

ios - Realm ,-[__NSCFString timeIntervalSince1970] : unrecognized selector sent to instance

python - Python可以确定访问方法的对象的类吗

python - 重写 python 函数而不使用检查模块