【问题标题】:The retain cycle with block带块的保留循环
【发布时间】:2015-11-09 03:28:17
【问题描述】:

关于带有块的保留周期的问题。在 ARC 模型中。

比如说,一个名为“vc”的视图控制器的实例,它持有对一个块的引用。在块内,vc 用于某些操作:

{

    //this is a piece of code snippet in vc
    self.vcBlock = {

        [self someAction];

    }

}

我知道这会导致循环保留,因为 vc 持有对块的强引用,而块也会持有对 vc 的强引用。

但是如何在块中引用 vc 的成员变量:

{

    //this is a piece of code snippet in vc
    self.vcBlock = {

        [self.obj someAction];

    }

}

这会导致保留周期吗?我认为这些引用的关系可以解释如下:

所以,我认为不存在保留循环,有什么问题吗?

【问题讨论】:

    标签: objective-c objective-c-blocks retain-cycle


    【解决方案1】:

    表达式self.obj是在运行时求值的,这需要block保持self的值,所以还是有循环的。

    但是,如果您的图表是您想要的关系,即您的块引用了 self.obj在创建块时引用的对象,那么您可以简单地通过使用临时局部变量来实现这一点。 IE。代码如下:

    SomeType objRef = self.obj;
    self.vcBlock = ^{ ... [objRef someAction]; ... };
    

    这避免了循环,因为 self.obj 返回的 value(对象引用)首先复制到本地 objRef,然后 value 成为一部分块的已保存值(也就是它的 environmemt)。

    这是这种情况下的常用方法,但请记住,如果 self.obj 的值在块执行之前发生更改,那么块将不会看到该更改 - 这似乎从图表中得到你想要的。

    还请注意,循环本身不是问题,您可以创建循环,然后在没有问题的情况下打破它们 - 实际上这并不少见。只有在导致资源(如内存)未被回收时,循环才是问题。

    HTH

    【讨论】:

      【解决方案2】:

      属性访问在编译时转换为方法调用,因此在您的第二个示例中,它仍然是 self 被保留,并且您具有完全相同的循环。

      【讨论】:

      • 你的意思是:Obj *obj = [self getObjc]; [对象某些动作]; ?
      • 类似的东西,但除非你在属性声明中有getter=myGetter 属性,否则该方法将与属性具有相同的名称。在您的示例中,setter 将是 setObj
      • 另外,请注意直接使用实例变量 (_obj) 对您没有帮助。那仍然保留self,因为_obj 是一个结构成员,而ARC 不会(不能)保留在结构级别。
      【解决方案3】:

      确实存在retain循环,vcBlock持有对self(vc)的强引用, 或者你可以把它当作

      [[self obj] someAction];
      

      如果我们以这样的另一种形式调用此方法(如果 obj 是 ivar)

      [_obj someAction];//in fact ,it's equivalent to [self->obj someAction]
      

      因此该块始终持有对自身的强引用。

      【讨论】:

        【解决方案4】:

        第二种情况,可以避免retain循环:

        {
            MyObject* obj = self.obj;
            self.vcBlock = ^{ [obj someAction]; };
        }
        

        【讨论】:

          猜你喜欢
          • 2012-07-26
          • 1970-01-01
          • 2013-03-10
          • 1970-01-01
          • 2014-08-28
          • 2011-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多