当一个类(层次结构中间)被删除时,我们是否有一个保留周期?

时间:2017-06-13 06:48:06

标签: ios automatic-ref-counting class-hierarchy retention

情况:A类(祖父母类)保留B类(父类),B类(父类)保留C类(Child类)然后如果我删除了B类那么会发生什么,A类和C类是否有保留周期并导致内存泄漏?

1 个答案:

答案 0 :(得分:0)

取决于你是如何删除B类的。

  

如果我删除了B类,那么会发生什么

你是什么意思?如果您使用ARC,则不应该致电release。那么你是如何删除B类的呢?

因为A类持有对B类的强引用,所以B类的保留计数为1.现在唯一的方法是将B类的参考数量设为0并让ARC清除B类将B类的强引用设置为nil。

所以,如果在你的A班,如果你说,

self.classBReference = nil;

然后,B类的引用计数变为0,显然B类被解除分配,并且因为B类被解除分配,C类的引用计数变为0,因为C类强烈地被B类保持,B类不再存在。因此,C类现在成为ARC要删除的候选者。

概念验证:

这是我的班级宣言

class A {
    var binstance : B? = B() //Declared as optional because I need to set the reference to nil later :)

    deinit {
        print("A deinited")
    }
}

class B {
    var cinstance = C()

    deinit {
        print("B deinited")
    }
}

class C {
    deinit {
        print("C deinited")
    }
}

现在我在VC中创建了A类的实例,结果A,B和C都将引用计数为1。

var ainstance : A = A()

当我将ainstance设置为nil时,这是一系列调用

self.ainstance.binstance = nil
  

O / P

B deinited

C deinited