OC源码分析-block (四)内存管理
2019-01-12 本文已影响8人
TianTianBaby223
一 :
__block 修饰的int age,block会对其进行强引用.
![](https://img.haomeiwen.com/i2012189/8324daa029ca42c6.png)
block copy操作拷贝到堆中,其使用的__block 修饰的变量,也会拷贝到堆中.
![](https://img.haomeiwen.com/i2012189/aed76d6c39f2d542.png)
从堆中移除block时候,对所有引用的__block变量进行一次 release 操作
![](https://img.haomeiwen.com/i2012189/17ec9b44864142cc.png)
二 :
![](https://img.haomeiwen.com/i2012189/031777bea91a3dbc.png)
block对__block 修饰的 int age 变量进行一次强引用, 对NSObject 根据其__strong 或者是 __weak进行一次强引用,或者是弱引用
![](https://img.haomeiwen.com/i2012189/8923ef60b7f2a40b.png)
三 : 总结
三种变量在block中捕获
![](https://img.haomeiwen.com/i2012189/3623e3bb9bab04f8.png)
在源码中的表现
![](https://img.haomeiwen.com/i2012189/671e55147eed3c03.png)
![](https://img.haomeiwen.com/i2012189/f2a6368cf8465e12.png)
四 :forwarding指针
![](https://img.haomeiwen.com/i2012189/4665b5867080ee8f.png)
block 进行copy操作后,自身以及 所持有的int age 都放入了堆区,为了确保其访问的是堆空间的,age变量,所以先访问forwarding指针,forwarding指针永远指向__block自己.
![](https://img.haomeiwen.com/i2012189/727fee97eb3273bb.png)
五 : __block修饰的对象类型
![](https://img.haomeiwen.com/i2012189/643f7629bab55e99.png)
源码中的表现
![](https://img.haomeiwen.com/i2012189/9f39705c3d08a83b.png)
内存中表现
![](https://img.haomeiwen.com/i2012189/c713bd0893adcfd9.png)
六 : __block __weak 修饰变量
![](https://img.haomeiwen.com/i2012189/ca27379180e36237.png)
源码中表现
![](https://img.haomeiwen.com/i2012189/da427d0b55a28b87.png)
内存中表现
![](https://img.haomeiwen.com/i2012189/59760a107a17d93d.png)
注意 :
![](https://img.haomeiwen.com/i2012189/22602b8efd7434a9.png)