需要帮助了解Objective-C块

  • 本文关键字:Objective-C 了解 帮助 ios
  • 更新时间 :
  • 英文 :


这是来自Apple Blocks Docs,我很难理解这一点,请任何人以简单的方式解释

...您可以将块引用对任意类型的指针和 反之亦然。但是,您不能通过 指针解除操作员(*) - 因此,块的大小不能是 在编译时计算。

简单地说,块是一个参考。块内的代码存储在内存中,可以通过变量访问。void (^addingBlock)(int);是一个块声明,可以通过addingBlock变量访问(如addingBlock(5);)。

现在,可以将此参考转换为C识别的指针类型。有点像功能指针。如文档所述,唯一的视觉差异是使用*而不是^。这意味着您可以将块施放到功能指针上:

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

,甚至是无效的指针(或任何类型!)

void* voidPtr = (void*)addingBlock;

但是您提供的报价说的是,使用该指针指向一个块,您无法"取消"它。这意味着解释指针地址并获取该地址背后的数据。无法执行此操作意味着您无法在编译时确定其大小。

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

最新更新