该问题基本是上是老生常谈的了 知道的依旧知道 不知道就碰到block之外定义__weak之类的东西 有时感觉这样是不会引起循环引用 但是我还是想总结一下
iOS中的循环引用根源在于使用了引用计数的方式去去判断是否回收堆中开辟的内存空间。
我们在使用block时block会强引用block中使用的变量
如果是值类型数据 需要使用__block获取到值类型数据的读写权限 如果时址类型数据就没用了直接在block中使用即可(关于值类型和址类型见 我的另一片文章http://www.jianshu.com/p/38940fbaab46)
循环引用必须的构成强引用环状结构
1 block会强引用block中使用到的所有变量(天生如此)
2 再查看循环引用时先查看 block是否被某一类所强引用 如果产生了强引用的话在block内部的话就不能直接食用根本类生命周期相同的变量 一般来说就是我们常用的属性 一旦在block中使用了这用变量 必然会产生循环引用 在本类中dealloc函数中 使用打印函数不会有任何输出 也就证明了本类没有释放掉 被本类所强引用的block使用时内部如果想使用跟本类生命周期相同的属性是 self 要换成 weakSelf(可以人为调整的)
__weak ClassA * weakSelf = self;
__weak typeof(self) weakSelf = self;
均可
所以并不是需要在block中一律使用weak的具体还是要看是否构成强引用换装结构而定的 如果构成强引用环状结构 则该结构中的所有的变量所占有的内存空间均不会被释放 也就会导致内存泄漏