【问题标题】:Do we have a retention cycle when a class (middle of hierarchy) is removed?当一个类(层次结构的中间)被删除时,我们是否有一个保留周期?
【发布时间】:2017-06-13 06:48:06
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

取决于您如何删除 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

O/P

B 定义

C 定义

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多