美文网首页
循环引用

循环引用

作者: 双鱼子曰1987 | 来源:发表于2017-10-30 14:43 被阅读0次

1、循环引用原理

B对象是A对象的属性,若对A发送release消息,致使A引用计数为0,则会dealloc A对象,而在A的dealloc的同时,会向B对象发送release消息,这就是问题的所在。若A和B互相强引用,必然会导致A、B对象循环引用导致无法释放。

2、循环引用情景汇总:

  • delegate

  • NSTimer对于 target:self 的强引用处理。

  • block在copy时都会对block内部用到的对象进行强引用(ARC)。这种循环引用会被编译器捕捉到并及时提醒。

     self.someBlock = ^(Type var){
         [self dosomething];  
         //或者self.otherVar = XXX;
         //或者_otherVar = ...
     };
     
    
       /* 外部的weakSelf是为了打破环,从而使得没有循环引用,
        * 而内部的strongSelf仅仅是个局部变量,存在栈中,
        * 会在block执行结束后回收,不会再造成循环引用。
       */
       @property (nonatomic, copy) dispatch_block_t block;
    
       __weak typeof(self) weakSelf = self;
       self.block = ^{
           __strong typeof(self) strongSelf = weakSelf;
           dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                 NSLog(@"%@", strongSelf.str);
           });
       };
    
  • 关于@weakify和@strongify工作原理:

     #define weakify(object)  autoreleasepool{} __weak __typeof__(object) weak##_##object = object;
     #define strongify(object)  try{} @finally{} __typeof__(object) object = weak##_##object;
    

    @weakify(self)声明了一个指向self的弱引用类型的变量self_weak_。
    @strongify(self)是声明一个_strong类型的指向self_weak的self变量

关于block使用注意:
  • 跨对象的Block定义。如UITableViewCell通过block与vc进行数据通信交互,需要格外的注意。通过这样的方式如果没有处理好,block会重复的定义,且导致消息回调混乱,快速滚动会导致问题。

    //在block同样会对self强引用,需要weak处理。
    self.weakParent.copyBlock = ^() {
      self.name = @"~~~";
    };
    

3、如何检测?

相关文章

  • 4-8 循环引用

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

  • 循环引用的相关问题

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

  • iOS 内存管理面试题(循环引用)

    循环引用 循环引用的实质:多个对象相互之间有强引用,不能释放让系统回收。 如何解决循环引用? 1、避免产生循环引用...

  • 内存管理-循环引用

    三种类型循环引用 自循环引用 相互循环引用 多循环引用 自循环引用 假如有一个对象,内部强持有它的成员变量obj,...

  • iOS 循环引用

    1. 循环应用的分类: 自循环引用; 相互循环引用; 多循环引用; 自循环引用: 一个对象中有一个成员变量A; 如...

  • iOS开发 循环引用的几种场景

    delegate 循环引用如果delegate使用strong修饰容易引起循环引用 block 循环引用block...

  • Day2

    1 单方向的引用不会产生循环引用。循环引用:闭包引用了self,self引用了闭包。Swift推荐使用解决循环引用...

  • 避免Block的循环引用

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

  • iOS基础 Block解决循环引用

    block 循环引用循环引用 A对象持有B,B又持有A,互相强引用 解决循环引用问题:ARC 和MRC ARC:...

  • 2019-03-07 对WKWebView中的循环引用的理解

    WKWebView的这个循环引用很像定时器的循环引用。定时器的循环引用是因为系统runloop循环 强引用了执行...

网友评论

      本文标题:循环引用

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