前提ARC:
如果在Block中使用附有__strong修饰符的对象类型自动变量,那么当Block从栈复制到堆时,该对象为Block所持有。这样容易引起循环引用。
解决方案:根据Block的用途选择使用__block变量,__weak 修饰符或者__unsafe_unretained修饰符来避免循环引用。
下面做一个比较:
使用__block变量的优点如下:
- 通过__block变量可控制对象的持有期间
- 在不使用__weak修饰符的环境中不使用__unsafe_unretained修饰符即可
在执行Block时可动态决定是否将nil或其他对象赋值在__block变量中。
使用__block变量的缺点如下:
为避免循环引用,必须执行Block.