Block介绍
- block 本质上也是一个 OC 对象,它内部也有个 isa 指针
- block 是封装了函数调用以及函数调用环境的 OC 对象
- block 是封装函数及其上下文的 OC 对象
Block的三种类型
- _NSConcreteStackBlock:全局数据区的 Block 对象,在栈上创建。
- _NSConcreteMallocBlock:在堆上创建的 Block 对象
- _NSConcreteGlobalBlock:全局数据区的 Block 对象
对三种Block对象分别进行copy的结果为
- __NSGlobalBlock __ 调用 copy 操作后,什么也不做
- __NSMallocBlock __ 调用 copy 操作后,复制效果是:引用计数增加;副本存储位置是堆
- _NSStackBlock __ 调用 copy 操作后,复制效果是:从栈复制到堆;副本存储位置是堆
Block的类型如何界定?
NSGlobalBlock界定方法
- 不捕获全局变量(包括全局静态变量)
- 没有捕获变量或者捕获的只有局部静态变量
- 以指针形式截获局部静态变量
NSStackBlock
访问了外部变量,但没有强引用指向这个block
NSMallocBlock
访问了外部变量而且有强引用指向该block(或者作为函数返回值)就会自动将__NSStackBlock类型copy到堆上