这是来自 apple blocks docs我很难理解这一点,请任何人用简单的方式解释一下
...You can cast a block reference to a pointer of arbitrary type and vice versa. You cannot, however, dereference a block reference via the pointer dereference operator (*)—thus a block's size cannot be computed at compile time.
最佳答案
简单来说,一个 block 就是一个引用。 block 中的代码存储在内存中,可以通过变量访问。 void (^addingBlock)(int);
是一个 block 声明,可以通过 addingBlock 变量访问(例如,它可以像 addingBlock(5); 一样调用);
).
现在,这个引用可以转换为 C 识别的指针类型。有点像函数指针。正如文档所述,唯一的视觉差异是使用 *
而不是 ^
。这意味着您可以将 block 转换为函数指针:
void (*funcPointer)(int) = (void(*)(int))addingBlock;
甚至是空指针(或任何类型!)
void* voidPtr = (void*)addingBlock;
但是您提供的引述是说,对于一个 block 的指针,您不能“取消引用”它。这意味着解释指针地址,并获取该地址后面的数据。无法执行此操作意味着您无法在编译时确定其大小。
为什么?因为 Obj-C 的动态性; block 的内容只能在运行时确定,而 C 在本质上是相当静态的,并且在编译时确定了很多。
关于ios - 需要帮助理解 objective-c block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13029925/