这是来自苹果阻止文档的,我很难理解,请任何一个人用简单的方式来解释
...You可以对任意类型的指针进行块引用,反之亦然。但是,不能通过指针解引用操作符(*)-thus取消对块引用的引用,不能在编译时计算块的大小。
发布于 2012-10-23 14:51:09
简单地说,块就是一个参考。块中的代码存储在内存中,可以通过变量访问。void (^addingBlock)(int);是一个块声明,它可以通过addingBlock变量访问(如,它可以像addingBlock(5);一样被调用)。
现在,可以将此引用转换为C识别的指针类型。有点像函数指针。正如文档所述,唯一的视觉区别是使用*而不是^。这意味着您可以将块强制转换到函数指针:
void (*funcPointer)(int) = (void(*)(int))addingBlock;甚至是一个空指针(或任何类型!)
void* voidPtr = (void*)addingBlock;但是你提供的引语是,有了这个指向一个块的指针,你就不能“取消引用”。这意味着解释指针地址,并获取该地址后面的数据。无法做到这一点意味着您无法在编译时确定它的大小。
为什么?由于Obj的动态性,块的内容只能在运行时确定,而C在本质上是静态的,在编译时决定了很多。
https://stackoverflow.com/questions/13029925
复制相似问题