0

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

4

1 回答 1

0

取决于您如何删除 B 类。

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

你是什​​么意思 ?如果您使用 ARC,则不应调用release. 那么您是如何删除 B 类的呢?

因为 A 类持有对 B 类的强引用,所以 B 类的保留计数为 1。现在您可以将 B 类的引用计数设为 0 并让 ARC 清理 B 类的唯一方法是设置 B 类的强引用为零。

所以,如果在你的 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

输出/输出

B 定义

C定义

于 2017-06-13T07:04:49.523 回答