ios - 需要帮助理解 objective-c block

标签 ios

这是来自 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/

相关文章:

android - 我应该为 iOS(Game Center) 和 Android(Google Play Games) 创建不同的项目吗?

ios - 当互联网中断时,它使我的应用程序在加载数据时处于缓慢状态

ios - Flutter BoringSSL-GRPC 无法安装

ios - RXSwift - 如何调用一个 api

ios - 在 friend 的个人资料下为 iPhone 进行开发时出现代码签名错误

ios - UITextField becomeFirstReponder 不工作

ios - 在 iOS 中创建消息屏幕

android - 设备间App通信的建议

ios - 从 View 层次结构中删除 subview 并将其删除的正确方法是什么?

ios - UITableView:如何只实现一行与其他行不同