block循环引用原因:一个对象A有Block类型的属性,从而持有这个block,如果block的代码块中使用到这个对象A,或者仅仅是用用到A对象的属性,会使block也持有A对象,导致两者互相持有,不能在作用域结束后正常释放。
解决原理:对象A照常持有Block,但Block不能强引用持有对象A以打破循环。
解决方法:
方法一: 对block内要使用的对象A使用_*_weak*进行修饰,block对对象A弱引用打破循环。
方法二:对block内要使用的对象A使用__block进行修饰,并在代码块内,使用完__block变量后将其设为nil,并且该block必须至少执行一次
方法三:将在block内要使用到的对象(一般为self对象),以block参数的形式传入,block就不会捕获该对象,而将其作为参数使用,其生命周期系统的栈自动管理,不造成内存泄露。