C中的Objective-C块

C中的Objective-C块,objective-c,c,cocoa-touch,cocoa,objective-c-blocks,Objective C,C,Cocoa Touch,Cocoa,Objective C Blocks,在阅读中的模块概念概述时,我看到了以下陈述: 虽然块对于纯C和C++是可用的,但块也是 始终是一个Objective-C对象 这怎么可能?我是指纯C语言中的Objective-C对象。我感到困惑。来自同一文档 float (^oneFrom)(float); oneFrom = ^(float aFloat) { float result = aFloat - 1.0; return result; }; 一个来自引用块(对象){float result=aFloat-1.0

在阅读中的模块概念概述时,我看到了以下陈述:

虽然块对于纯C和C++是可用的,但块也是 始终是一个Objective-C对象


这怎么可能?我是指纯C语言中的Objective-C对象。我感到困惑。

来自同一文档

float (^oneFrom)(float);

oneFrom = ^(float aFloat) {
    float result = aFloat - 1.0;
    return result;
};
一个来自引用块(对象)
{float result=aFloat-1.0;return result;}


块是纯C和C++的,IE。块可以由纯C或C++代码组成。

< P> Objto-C可以与C自由混合。只要类有C API(哪些块做,用BaskION,BILKION释放等等),C代码不在乎它是否在Objtovi-C或C.</P>中实现。 这怎么可能?我指的是纯C语言中的Objective-C对象

马特·加拉赫写道。简而言之,块定义为满足有效Objective-C对象要求的结构(例如,结构以
isa
指针开始)。所有这些都不会给C带来问题,而且编译器知道块的定义是什么,所以即使在编译普通的旧C时,它仍然可以做正确的事情使块工作

块添加的Objective-C方面并不影响块在C中的使用方式,但仍然提供了将块作为对象处理的能力,以便可以将它们添加到集合中,并像任何其他对象一样进行管理


这并不奇怪。仔细想想,所有Objective-C对象在某种程度上在C中都是“可用的”——由操作表示Objective-C对象和类的结构的C函数组成。甚至忽略了,块不是C和ObjuleC中都可用的数据类型的第一个例子——我们在基础和核心基础上已经有很多年了。块的实现可能有些不同,但让对象在两个世界都工作并不是一件新鲜事。

那么Objective-C和C只是在语言语义上不同吗?@Rakesh:嗯,它也有不同的语义。但重要的是C是Objective-C的一个子集。我理解这一点,这让我感到困惑。既然C是Objective-C的子集,那么Objective-C对象如何可以在纯C代码中使用呢。或者,C(仅限)编译器是否可以编译包含块的代码?@Rakesh:嗯,编译器必须支持块。它们实际上不是标准C的一部分;它们是苹果在叮当声中添加的一个扩展。但是它们可以在C文件中使用,因为Objective-C与C是二进制兼容的。@ajay:这意味着Objective-C编译器生成的代码可以链接到C程序中,其公共数据可见,其公共函数可调用。基本上,它们都编译成相同的东西。谢谢你的详细解释。有一件事,编译器仍然需要识别块语法(例如,^符号),对吗?i、 就像chuck说的那样,编译器仍然需要结合对块的支持?是的,你仍然需要一个支持块的编译器和一个支持块的运行库。在OSX和iOS上,这是叮当声和LibClose。