这是来自Apple Blocks Docs,我很难理解这一点,请任何人以简单的方式解释
...您可以将块引用对任意类型的指针和 反之亦然。但是,您不能通过 指针解除操作员(*) - 因此,块的大小不能是 在编译时计算。
简单地说,块是一个参考。块内的代码存储在内存中,可以通过变量访问。void (^addingBlock)(int);
是一个块声明,可以通过addingBlock变量访问(如addingBlock(5);
)。
现在,可以将此参考转换为C识别的指针类型。有点像功能指针。如文档所述,唯一的视觉差异是使用*
而不是^
。这意味着您可以将块施放到功能指针上:
void (*funcPointer)(int) = (void(*)(int))addingBlock;
,甚至是无效的指针(或任何类型!)
void* voidPtr = (void*)addingBlock;
但是您提供的报价说的是,使用该指针指向一个块,您无法"取消"它。这意味着解释指针地址并获取该地址背后的数据。无法执行此操作意味着您无法在编译时确定其大小。
为什么?因为OBJ-C的动态;该块的内容只能在运行时确定,而C本质上相当静态,并且在编译时确定了很多。