Block的本质
Block本质是一个oc对象,它内部有一个isa指针
Block是封装了函数调用以及函数调用环境的oc对象
Block 的变量捕获(capture)
![](https://img.haomeiwen.com/i4247320/71deed12440cdc0e.png)
Block类型
![](https://img.haomeiwen.com/i4247320/f5fbeb82de36026f.png)
MRC情况下
![](https://img.haomeiwen.com/i4247320/313f1cf79f880fb3.png)
Block类型copy 结果 MRC情况下 (ARC 自动从栈区 拷贝到堆区)
![](https://img.haomeiwen.com/i4247320/583b9feb64254065.png)
ARC情况下Copy
编译器会自动把栈区 block 拷贝到堆区
block作为函数的返回值时
block赋值给_ _strong指针时(强指针时)
block最为cocoaAPI中方法名usingBlock的方法参数时 比如数组遍历[array enumeObjc usingBlock.....]
block最为GCD API方法参数时
当对象类型的auto变量时
当block内部访问了对象类型的auto变量时
如果block在栈区,将不会对auto变量产生强引用(mrc 或arc情况)
如果block在堆区
![](https://img.haomeiwen.com/i4247320/9c21d2977e8d18fd.png)
__block修饰符
![](https://img.haomeiwen.com/i4247320/85643da025ed0804.png)
__block内存管理问题
![](https://img.haomeiwen.com/i4247320/db6bca769440888c.png)
对象类型的auto变量 __block变量
![](https://img.haomeiwen.com/i4247320/ab08db5c87f29564.png)
block 循环引用
ARC环境下
![](https://img.haomeiwen.com/i4247320/f3e2419557a7953e.png)
![](https://img.haomeiwen.com/i4247320/9c12e0f6bacb9a7b.png)
ARC环境下 (不支持弱指针 __weak)
![](https://img.haomeiwen.com/i4247320/4a4e4ecde0fc8c0a.png)
网友评论