如何避免在Block里用self造成循环引用

Posted 开心刘哈哈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何避免在Block里用self造成循环引用相关的知识,希望对你有一定的参考价值。

原文:http://blog.csdn.net/zhangao0086/article/details/38273239

一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调Block的时候Block已经被释放了,所以我们需要对Block进行copy,copy到堆中,以便后用。

当一个Block被Copy的时候,如果你在Block里进行了一些调用,那么将会有一个强引用指向这些调用方法的调用者,有两个规则:

 

  • 如果你是通过引用来访问一个实例变量,那么将强引用至self
  • 如果你是通过值来访问一个实例变量,那么将直接强引用至这个“值”变量
苹果官方文档里有两个例子来说明这两种情况:
技术分享
上面第一种情况相当于用self.xxx来访问实例变量,所以强引用指向了self;第二种情况把实例变量变成了本地临时变量,强引用将直接指向这个本地的临时变量。大多数情况下,我们只用处理第一种情况就行了,因为第二种情况虽然会造成循环引用,但是临时变量很快就被释放了,不会造成真正的循环引用。要避免强引用到self的话,用__weak把self重新引用一下就行了,像这样:
[objc] view plain copy
 

  1. __weak ViewController *weakSelf = self;  

 

 
 

以上是关于如何避免在Block里用self造成循环引用的主要内容,如果未能解决你的问题,请参考以下文章

Block 循环引用

Block 循环引用(中)

iOS Block循环引用精讲

weakSelf 和 strongSelf

常见的出现内存循环引用的场景有哪些?

剖析RAC中的@weakify@strongify