需要帮助理解Objective-c块

时间:2012-10-23 11:58:30

标签: ios

这是来自apple blocks docs,我很难理解这一点,任何人都可以用一点简单的方式解释

  

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

void* voidPtr = (void*)addingBlock;

但是你所提供的引言是,用这个指向一个块的指针,你不能“取消引用”它。这意味着解释指针地址,并获取该地址后面的数据。无法执行此操作意味着您无法在编译时确定其大小。

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