iOS高级工程师必备知识之block强循环引用
block对对象型变量进行截取的时候,会连同变量修饰符一起截取。
//self变量默认是带__strong修饰符的
self.block=^{
NSLog(@"%@",self.view);
};
上例中,block是 self指向的对象持有的属性,而在block内部,又截获(复制了)指向self的强引用指针,这样就造成了block所属的对象对block强引用,block内部的self变量又对block所属的对象发生强引用,即循环引用。看下面这个例子:
block循环引用造成内存泄露
当进入上图中的viewController中时,发生了强强引用。当退出该页面几秒过后时,该viewController也没有被销毁(self 指针不为空)。
解决的办法时在block之外声明一个弱引用指针,来指向self,当block截获到该弱指针的时候,也不会对self对象发生强引用循环。
__weak修饰符避免强引用循环
Demo在这里