C和Objective C中块的区别

7
这是来自Block编程指南概念概述部分的摘录。
您可以复制块甚至将其传递到其他线程以进行延迟执行(或在其自己的线程中到运行循环)。编译器和运行时会安排所有从块引用的变量在块的所有副本的生命周期内被保留。尽管块对于纯C和C ++可用,但块也始终是Objective-C对象。
我一直试图理解最后一句话,但未能理解。对我来说,句子的前两部分似乎不兼容(我可能遗漏了什么)。这是否意味着C / C ++和Objective C中的块不同?这是由于Objective C中捕获块对象的方式造成的吗?
2个回答

4

好的,在查找一番后,我找到了一些答案的指针(没有双关语)。clang的块语言规范关于Objective-C扩展的定义如下:

Objective-C将块引用类型的定义扩展为id类型。块类型的变量或表达式可以在任何需要id的地方进行消息传递或使用作为参数。反之亦然。因此,块引用可以出现为属性,并且受到为对象保留的分配、保留和复制属性逻辑的约束。

所有块都被构造为Objective-C对象,无论程序中是否运行Objective-C运行时。使用自动(栈)内存的块是对象,可以进行消息传递,尽管如果启用垃圾收集,则不能将其分配到__weak位置。

尽管我仍然困惑于块运行时是否以相同的方式处理Objective C和C(即使正在编译纯C,也会创建Objective C对象),以及苹果提出的对C的扩展是否旨在允许在C/C++中使用块而不创建Objective C对象。欢迎评论。


2
一个Objective-C对象只是一个带有一些要求的C结构体,因此,在C和Objective-C中它们完全相同。编译器在技术上只是添加了代码来创建这些结构之一。没有Objective-C运行时库,一些部分(如类)将被忽略。 - ughoavgfhw

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接