美文网首页
老生重谈循环引用

老生重谈循环引用

作者: 阿龍飛 | 来源:发表于2019-01-18 17:53 被阅读19次

野指针指向一个已删除的对象或未申请访问受限内存区域的指针。特别要指出的是野指针不是空指针。
一提到 Block 大家肯定都知道要说的是循环引用,在 ARC 中,如果两个对象相互持有对方,就会造成循环引用,导致内存无法释放。在 Block 中,最常用的场景则是,self 持有 block , block 中又持有了 self 。例如下方一段代码:

- (void)setUpModel{
  XYModel *model = [XYModel new];
  model.dataChanged = ^(NSString *title) {
      self.titleLabel.text = title;                
  };
  self.model = model;
}

上面的这段代码就会造成循环引用。那我们怎么破除呢?通常的做法都是使用 weakSelf 来处理,即:

- (void)setUpModel {
  XYModel *model = [XYModel new];
  __weak typeof(self) weakSelf = self;
  model.dataChanged = ^(NSString *title) {
      weakSelf.titleLabel.text = title;   
  };
  self.model = model;
}

或许你还看到另外一种不是很一样的版本:

- (void)setUpModel {
  XYModel *model = [XYModel new];
  __weak typeof(self) weakSelf = self;
  model.dataChanged = ^(NSString *title) {
      __strong typeof(self) strongSelf = weakSelf;
      strongSelf.titleLabel.text = title;   
  };
  self.model = model;
}

对比一下,多了一个 strongSelf 。那为什么又要多加一个 strongSelf 呢?

__weak __typeof__(self) weakSelf = self;
dispatch_group_async(_operationsGroup, _operationsQueue, ^{
  [weakSelf doSomething];
  [weakSelf doSomethingElse];
});

在 doSomething 时, weakSelf 不会被释放,但是在 doSomethingElse 时,weakSelf 有可能被释放。
在这里就需要用到 strongSelf ,使用 __strong 确保在 Block 内, strongSelf 不会被释放。

小结

在使用 Block 时,如遇到循环引用问题,可以使用 __weak 来破除循环引用。
如果在 Block 内需要多次访问 __weak 变量,则需要使用 __strong 来保持变量不会被释放。

相关文章

  • 老生重谈循环引用

    野指针指向一个已删除的对象或未申请访问受限内存区域的指针。特别要指出的是野指针不是空指针。一提到 Block 大家...

  • OC - Block(二)- 循环引用

    block的循环引用 block的循环引用,真的是老生常谈的话题了,循环引用的诱因可以说是一个闭环,你中有我我中有...

  • RxSwift-内存管理

    内存管理老生常谈,首先明确不是所有闭包中使用了self,就会造成循环引用,而是一定要产生循环引用链,那么在使用Rx...

  • Block循环引用

    一说起Block,肯定就要说它的循环引用.这是个老生常谈的问题,也是我们面试中经常被问到的.循环引用就说:我中有你...

  • 问题:描述一个你所遇到retain cycle例子

    循环引用的常见的三种场景 delegate在委托问题上出现循环引用问题已经是老生常谈了,规避该问题的杀手锏也是简单...

  • 4-8 循环引用

    3种循环引用 自循环引用 相互循环引用 多循环引用 Block的循环引用 NSTimer 的循环引用 破除循环引用...

  • 循环引用的相关问题

    1、循环引用的种类(1)自循环引用(2)相互循环引用(3)多循环引用 如何破除循环引用?(1)避免产生循环引用(2...

  • iOS循环引用

    在iOS开发中,循环引用是个老生常谈的问题.delegate为啥使用weak修饰,block为什么需要weakSe...

  • 关于NSTimer循环引用及解决

    1. NSTimer循环引用问题 这是一个老生老生常谈的一个问题,但是其中还是有一些细节问题我觉得值得去写篇文章记...

  • iOS开发 - 老生常谈的循环引用问题

    内存管理在iOS开发中很重要,在iOS 5之前,开发者需要使用MRC(Manual Reference Count...

网友评论

      本文标题:老生重谈循环引用

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