0

这是来自apple blocks docs,我很难理解这一点,请任何人都可以简单地解释一下

...您可以将块引用转换为任意类型的指针,反之亦然。但是,您不能通过指针取消引用运算符 (*) 取消引用块引用,因此无法在编译时计算块的大小。

4

1 回答 1

3

简单地说,一个块是一个引用。块中的代码存储在内存中,可以通过变量访问。void (^addingBlock)(int);是一个块声明,可以通过 addBlock 变量访问(如,它可以被称为 like addingBlock(5);)。

现在,该引用可以转换为 C 识别的指针类型。有点像函数指针。正如文档所述,唯一的视觉区别是使用*代替^。这意味着您可以将块转换为函数指针:

void (*funcPointer)(int) = (void(*)(int))addingBlock;

甚至是一个空指针(或任何类型!)

void* voidPtr = (void*)addingBlock;

但是你提供的报价说的是,有了这个指向块的指针,你不能“取消引用”它。这意味着解释指针地址,并获取该地址后面的数据。无法做到这一点意味着您无法在编译时确定其大小。

为什么?由于 Obj-C 的动态性;块的内容只能在运行时确定,而 C 在本质上是相当静态的,并且在编译时确定了很多。

于 2012-10-23T14:51:09.157 回答