block循环引用的一种特殊形式及解决方法

众所周知,解决block循环引用最常用的方式就是 使用__weak typeof(xx) name = xx; 解决
今天遇到个神奇的问题 明明已经使用了weakSelf了 但是控制器在pop后怎么也释放不了
最后发现是在block内使用了带下划线的变量去取值导致了block对控制器的强引用

//A中有对象b 和成员变量x  对象b中有block c
A *a = [A new];
// a.b  a.b.c   a.x
__weak typeof(A)  wa = A;
a.b.c = ^{
  //注意 使用wa去操作的是可以的 
[wa.b action];  
[wa.x action];
/**
错误用法
这是在A的.m内操作  所以可以使用_b   _x
但是如果在block中使用_b 或者_x的话
那么这个block 其实会对a 有强引用的  如此__weak就没有用了 最后a这个对象怎么也释放不了
解决方法: 1.想销毁之前把这个block置为nil 2.还是使用点语法去取变量值吧
*/
  
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容