这是apple blocks docs,我难以理解这个可以请任何一个小简单的方法需要帮助理解的Objective-C块
解释......你可以蒙上块参照的任意一个指针类型和 反之亦然。但是,您不能通过 指针解引用运算符(*)取消引用块引用 - 因此在编译时计算的块大小不能为 。
这是apple blocks docs,我难以理解这个可以请任何一个小简单的方法需要帮助理解的Objective-C块
解释......你可以蒙上块参照的任意一个指针类型和 反之亦然。但是,您不能通过 指针解引用运算符(*)取消引用块引用 - 因此在编译时计算的块大小不能为 。
简而言之,块是参考。块内的代码存储在内存中,可以通过变量访问。 void (^addingBlock)(int);
是一个块声明,可以通过addBlock变量访问(如在,它可以被称为像addingBlock(5);
)。
现在,这个引用可以被转换成C识别的指针类型。有点像一个函数指针。正如文档所述,唯一的视觉差异是使用*
而不是^
。这意味着你可以施放块函数指针:(!或任何类型)
void (*funcPointer)(int) = (void(*)(int))addingBlock;
甚至一个空指针
void* voidPtr = (void*)addingBlock;
但是,您所提供的报价说,是与这个指向块的指针,你不能'取消引用'它。这意味着解释指针地址,并获取该地址后面的数据。无法做到这一点意味着您无法在编译时确定其大小。
为什么?由于Obj-C的动态性,块的内容只能在运行时确定,而C本质上是相当静态的,并且在编译时确定很多。
非常感谢您解决我的困惑。 –
[This](http://www.cocoawithlove.com/2009/10/ugly-side-of-blocks-explicit.html?m=1)应该回答你的问题,等等。 – CodaFi
感谢您的链接。 –