Block的本质
Block本质是一个oc对象,它内部有一个isa指针
Block是封装了函数调用以及函数调用环境的oc对象
Block 的变量捕获(capture)
111.png
Block类型
222222.png
MRC情况下
3333.png
Block类型copy 结果 MRC情况下 (ARC 自动从栈区 拷贝到堆区)
4444.png
ARC情况下Copy
编译器会自动把栈区 block 拷贝到堆区
block作为函数的返回值时
block赋值给_ _strong指针时(强指针时)
block最为cocoaAPI中方法名usingBlock的方法参数时 比如数组遍历[array enumeObjc usingBlock.....]
block最为GCD API方法参数时
当对象类型的auto变量时
当block内部访问了对象类型的auto变量时
如果block在栈区,将不会对auto变量产生强引用(mrc 或arc情况)
如果block在堆区
5555.png
__block修饰符
666.png
__block内存管理问题
7777.png
对象类型的auto变量 __block变量
888.png
block 循环引用
ARC环境下
111.png
2222.png
ARC环境下 (不支持弱指针 __weak)
3333.png