block本质是什么,需要注意什么?
Block 的本质是一个封装了函数和函数调用环境(捕获的变量)的 Objective-C 对象。Block 的实现基于 C 语言的函数指针,但它们比普通的函数指针更加强大,因为它们能够捕获周围的状态。
在 Objective-C 中,每个 block 实际上是一个结构体,该结构体包含了几个重要的元素:
isa
指针,表明这是一个对象,并指向该 block 类型的类对象。- 函数指针,指向 block 的执行体(即 block 里写的代码)。
- 捕获的变量的副本,block 能够捕获其作用域内的变量,这些变量在 block 被定义时拷贝到了 block 结构体中。
- 引用计数,用于在非 ARC 环境下管理 block 的生命周期。
- 其他用于管理 block 生命周期和状态的字段。
使用 block 时需要注意以下几个方面:
-
循环引用:Block 内部如果捕获了
self
或其成员变量,且self
同时持有这个 block,会产生循环引用,导致内存泄漏。为了打破循环引用,通常会使用 __weak 关键字来声明一个self
的弱引用。 -
内存管理:在非 ARC 环境下,需要手动管理 block 的拷贝和释放。在 ARC 环境下,block 通常会自动从栈复制到堆上,但仍需要注意循环引用问题。
-
变