iOS高级工程师必备知识之block强循环引用

block对对象型变量进行截取的时候,会连同变量修饰符一起截取。

   //self变量默认是带__strong修饰符的

    self.block=^{

        NSLog(@"%@",self.view);

    }; 

上例中,block是 self指向的对象持有的属性,而在block内部,又截获(复制了)指向self的强引用指针,这样就造成了block所属的对象对block强引用,block内部的self变量又对block所属的对象发生强引用,即循环引用。看下面这个例子:

 

iOS高级工程师必备知识之block强循环引用

block循环引用造成内存泄露

当进入上图中的viewController中时,发生了强强引用。当退出该页面几秒过后时,该viewController也没有被销毁(self 指针不为空)。

解决的办法时在block之外声明一个弱引用指针,来指向self,当block截获到该弱指针的时候,也不会对self对象发生强引用循环。

iOS高级工程师必备知识之block强循环引用

__weak修饰符避免强引用循环

Demo在这里