C和目标C中的块之间的差异

时间:2011-11-15 14:09:58

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

以下摘自Blocks Programming Guide Conceptual Overview部分

  

您可以复制一个块,甚至将其传递给其他线程以进行延迟   执行(或在其自己的线程内,到runloop)。编译器和   运行时安排从块引用的所有变量   保留了所有副本的生命。 虽然是块   可用于纯C和C ++,块也始终是Objective-C   对象

我一直试图从最后一句话中弄清楚,但没有成功。句子的第一部分和第二部分似乎与我不相容(我可能遗漏了一些东西)。这是否意味着块在C / C ++和目标C中不是一回事?这是由于捕获了目标C中的块对象的方式吗?

2 个答案:

答案 0 :(得分:4)

好的,经过一些环顾四周,我找到了一些指向答案的指针(没有双关语意)。 clang block language specification说明了Objective-C Extensions

  

Objective-C将Block引用类型的定义扩展为   也是id。 Block类型的变量或表达式可以是   在id可能的任何地方发送消息或用作参数。相反的是   也是如此。因此,块引用可以显示为属性   受赋值,保留和复制的属性逻辑   保留给对象。

     

所有块都构造为Objective-C对象,无论如何   Objective-C运行时是否在程序中可操作。   使用自动(堆栈)内存的块是对象,可以是消息,   虽然垃圾可能不会被分配到__weak位置   集合已启用。

虽然我仍然对块运行时是否以相同的方式处理Objective C和C(即使正在编译纯C也创建Objective C对象)以及apple's proposed extension to C是否允许在没有创建Objective C对象的C / C ++。欢迎评论。

答案 1 :(得分:0)

定义块的方式,它们需要一些运行时支持。即使您可以在普通的C ++或C程序中声明它们并使用Block_copyBlock_release与它们进行交互,编译器也会调用Blocks运行时中的链接来为您管理它们。