Block 在 Objective-C 中也是被当成对象的, Block 有三种类。
类 | 设置对象的存储区域 |
---|---|
_NSConcreteStackBlock | 栈 |
_NSConcreteClobalBlock | 程序的数据区域(.data 区) |
_NSConcreteMallocBlock | 堆 |
|
|
在没有捕获任何自动变量的时候, Block 的类型为NSGlobalBlock
.
|
|
捕获自动变量的时候, Block 的类型为NSStackBlock
.
|
|
对 Block 在堆上进行复制的时候, 复制后的类型为NSMallocBlock
.
将 Block 作为函数的返回值时, 编译器会自动生成复制到堆上的代码. Blocks 从栈上复制到堆中, 这样即使 Block 的变量作用域结束, 堆上的 Block 还可以继续存在.
在ARC开启的情况下,将只会有NSConcreteGlobalBlock
和 NSConcreteMallocBlock
类型的block。原本的NSConcreteStackBlock
的block会被NSConcreteMallocBlock
类型的block替代。