2012-10-23 186 views
0

这是apple blocks docs,我难以理解这个可以请任何一个小简单的方法需要帮助理解的Objective-C块

解释......你可以蒙上块参照的任意一个指针类型和 反之亦然。但是,您不能通过 指针解引用运算符(*)取消引用块引用 - 因此在编译时计算的块大小不能为 。

+2

[This](http://www.cocoawithlove.com/2009/10/ugly-side-of-blocks-explicit.html?m=1)应该回答你的问题,等等。 – CodaFi

+0

感谢您的链接。 –

回答

3

简而言之,块是参考。块内的代码存储在内存中,可以通过变量访问。 void (^addingBlock)(int);是一个块声明,可以通过addBlock变量访问(如在,它可以被称为像addingBlock(5);)。

现在,这个引用可以被转换成C识别的指针类型。有点像一个函数指针。正如文档所述,唯一的视觉差异是使用*而不是^。这意味着你可以施放块函数指针:(!或任何类型)

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

甚至一个空指针

void* voidPtr = (void*)addingBlock; 

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

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

+0

非常感谢您解决我的困惑。 –