最简单也最常出现的,block导致循环引用的现象,就是在block中执行了self.xxx,比如


这个问题大家的见的多了,也都知道怎么解决,声明一个用__weak修饰的self替换block中的self就可以解决问题了,不过下面这个方法也能够解决循环引用的问题

这是为什么?boss1明明和self.boss是同一个东西,怎么就不会循环引用了呢?

我们一步一步分析一下这两个案例的整个过程,先看看第一种方式是怎么导致循环引用的
1.首先我们在self中创建了boss对象,self持有了boss

2.我们又创建了block,那么self同时也持有了block

3.这时我们在block调用了self.boss,那么根据block的特性,block将strong里面所有的对象,所以block也持有self

循环引用就是这么产生的,self和block互相持有

那么我们再分析一下第二种情况为什么不会有循环引用的问题
1.第一步和之前一样,我们创建了boss

2.第二步我们创建了一个boss1指向了self.boss,一切对象皆指针,我们明白这个boss1和self.boss其实是同一个东西,并不是副本,也不存在持有的现象

3.同样我们创建了block,self持有了block

4.最后,我们在block中调用了boss1,由于boss1和boss不存在强引用,强引用链在这里被打破了,所以不会产生循环引用.

原创文章,转载请注明出处,谢谢!