美文网首页iOS 开发Block详解
避免Block的循环引用

避免Block的循环引用

作者: David_Cap | 来源:发表于2015-07-30 13:52 被阅读10206次

避免Block的循环引用

什么是循环引用,什么时候发生循环引用

1 循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。

 self.myBlock = ^{
    [self doSomething];
  };
       +-----------+           +-----------+
       |    self   |           |   Block   |
  ---> |           | --------> |           |
       | retain 2  | <-------- | retain 1  |
       |           |           |           |
       +-----------+           +-----------+

又或者

ClassA* objA = [[[ClassA alloc] init] autorelease];
  objA.myBlock = ^{
    [self doSomething];
  };
  self.objA = objA;

  +-----------+           +-----------+           +-----------+
  |   self    |           |   objA    |           |   Block   |
  |           | --------> |           | --------> |           |
  | retain 1  |           | retain 1  |           | retain 1  |
  |           |           |           |           |           |
  +-----------+           +-----------+           +-----------+
       ^                                                |
       |                                                |
       +------------------------------------------------+

这是时官方的解释。

大体意思就是,例如self 有一个button ,而你又要 调用 button的某个东西设置.

[self.button  ^{ }]

到这步为止那就一点问题都没有,但是由于某些原因,你又要在这个block里调用

self.label.text = @"I am Label";

就变成这样了。

[self.button  ^{
      self.label.text = @"I am Label";
 }];

//这个时候就变成这样了。
  +-----------+           +-----------+           +-----------+
  |   self    |           |  button   |           |   Block   |
  |           | --------> |           | --------> |           |
  | retain 1  |           | retain 1  |           | retain 1  |
  |           |           |           |           |           |
  +-----------+           +-----------+           +-----------+
       ^                                                |
       |                                                |
       +------------------------------------------------+

大体理解就是这样,如果有偏差,欢迎指出。

解决方法

简而言之就一句话的事情:

__weak typeof (self) weakSelf = self;

例如上面那个例子,只要如下即可。

 __weak typeof (self) weakSelf = self;
[self.button  ^{
      weakSelf.label.text = @"I am Label";
 }];

//这个时候就变成这样了。
  +-----------+           +-----------+           +-----------+
  |   self    |           |  button   |           |   Block   |
  |           | --------> |           | --------> |           |
  | retain 1  |           | retain 1  |           | retain 1  |
  |           |           |           |           |           |
  +-----------+           +-----------+           +-----------+
       ^                                                |
       |                                                |
       + - - - - - - - - - - - - - - - - - - - - - - - -+
                               weak

相关文章

  • __block与__weak的真正区别

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block...

  • __block和__weak修饰符的区别

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block...

  • __block与__weak的区别

    block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block...

  • __block 和__ weak 的区别

    1:在 block 下循环引用的问题.○ __block 本身并不能避免循环引用,避免循环引用需要在block内部...

  • 避免Block的循环引用

    避免Block的循环引用 什么是循环引用,什么时候发生循环引用 1 循环引用就是当self 拥有一个block的...

  • iOS中block详解 weakSelf , strongSel

    在block中避免循环引用 我们知道,在使用block的时候,为了避免产生循环引用,通常需要使用weakSelf和...

  • __block与__weak的真正区别

    其实这个问题在现在来说主要就是2个区别: block下循环引用的问题 __block本身并不能避免循环引用,避免循...

  • block中的weak&strong self

    在block中使用self的时候,需要在外部将self弱化,从而不让block持有self,避免循环引用。循环引用...

  • iOS 内存优化

    1. 避免内存泄漏 ① 避免对象之间循环引用(代理一定要弱引用)② block 中对象的循环引用、添加的通知在销毁...

  • block3

    Block循环引用 没有调用dealloco 持有blk_blk_持有o, __weak避免循环引用 也可以用__...

网友评论

  • Pusswzy:图画的不错
  • 肾得朕心:请问 [self doSomething]; 这个方法里如果也用到self了呢
    我是夏末啊:[weakself dosomething];这个方法里面用到了self,不会引起循环引用
    David_Cap:所以呢,你的问题是什么
  • 洁简:如果把self.label.text 改为_label也会循环引用吗?
    David_Cap:@洁简 你看看 那些类的 dealloc 走不走嘛。
    David_Cap:@洁简 写个Demo 试试。
  • biyuhuaping:看了这么多写Block的循环引用的,就你的最简单易懂了!👍赞!
    jianshu小赵:@biyuhuaping 是形象 不是low
    biyuhuaping:@David_Cap 不不不,你谦虚了,真正厉害的,往往是能以最简洁的方式解答一个非常复杂的问题,你做到了,还做到很好!👍
    David_Cap:可能是因为我比较low 接地气。。。。
    :joy:

本文标题:避免Block的循环引用

本文链接:https://www.haomeiwen.com/subject/qxamqttx.html