Objective c C中的块与目标C之间的差异

Objective c C中的块与目标C之间的差异,objective-c,c,objective-c-blocks,Objective C,C,Objective C Blocks,这是本节的摘录 您可以复制一个块,甚至可以将其传递给其他线程进行延迟 执行(或者,在自己的线程中,执行到runloop)。编译器和 运行时安排从块引用的所有变量 在区块的所有副本的有效期内保存虽然块是 对于纯C和C++,块也是一个Objto-C。 对象。 我一直想弄明白最后一句话的意思,但没能理解。句子的第一部分和第二部分对我来说似乎不相容(我可能遗漏了什么)。这是否意味着块在C/C++和objective C中是不同的?这是因为目标C中块对象的捕获方式吗?块的定义方式需要一些运行时支持。即使你

这是本节的摘录

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


我一直想弄明白最后一句话的意思,但没能理解。句子的第一部分和第二部分对我来说似乎不相容(我可能遗漏了什么)。这是否意味着块在C/C++和objective C中是不同的?这是因为目标C中块对象的捕获方式吗?

块的定义方式需要一些运行时支持。即使你可以在一个简单的C++或C程序中声明它们,并使用<代码> BubjIsPox< /Cuff>和 <代码>与它们进行交互,编译器也会调用链接块运行时来管理它们。

< P> OK,在我环顾四周之后,我发现了一些指针来回答(没有双关语)。clang声明了关于Objective-C扩展的这一点

Objective-C将块参照类型的定义扩展为 块类型的变量或表达式可以是 无论id在何处,都作为参数发送消息或使用。反之亦然 也是这样。因此,块参照可能会显示为特性,并且 遵循指定、保留和复制属性逻辑,即 为对象保留

所有块都被构造为Objective-C对象,而不考虑 Objective-C运行时是否在程序中运行。 使用自动(堆栈)内存的块是对象,可以发送消息, 尽管它们可能不会被分配到弱位置,如果 已启用收集功能。


尽管我仍然不清楚blocks运行时是否以相同的方式处理Objective C和C(即使编译纯C,也要创建Objective C对象),以及是否允许在C/C++中使用Block而不创建Objective C对象。欢迎评论。

objective-c对象只是一个具有某些要求的c结构,因此是的,它们对于c和objective-c来说完全相同。从技术上讲,编译器只是添加代码来创建其中一个结构。如果没有objective-c运行时,某些部分(例如类)将被忽略。