考虑:
class A {
var a: Int
var b: String
weak var s: CustomType?
init(a:Int, b: String, s: CustomType?) {
…
}
func methods() {
}
}
class B {
…
var a: A
init(a: A) {
self.a = a
}
}
class C {
var b: B
init(s: CustomType?) {
let a = A(a: Int, b: String, s: CustomType?)
b = B(a: A)
}
}
// main
let s : CustomType? = CustomType() //
let c = C(s)
...
...
// finish
在这种情况下,我是否需要担心
s
或class A
的对象a
的内存管理?
或者 Swift 的内存管理系统(垃圾收集器?)会自动处理它? (或者 a
会变得悬空???)
在 Swift 内存管理系统(ARC;见下文)中,一旦不再有强引用,对象就会被释放。在这种情况下,
C
保持对B
的强引用,B
保持对A
的强引用,因此只要您保持对C
的强引用,您的A
和B
的实例
将保留。当您删除对 C 的强引用时,A 和 B 也会被释放。
但是你有
s
,一个CustomType
。并且 A
、B
和 C
都没有强烈引用它。因此,如果/当“main”删除了对 s
的最后一个强引用,即使 C
(因此,A
和 B
)也有挥之不去的强引用,weak
对 CustomType
的引用
A
中的将设置为
nil
。
需要澄清的是,Swift 不使用垃圾收集。它使用自动引用计数(ARC)。一旦最后一个强引用被删除,对象就会被释放和释放(与垃圾收集相反,垃圾收集的清理工作由内存管理系统决定一次进行)。
ARC
的想法是为开发人员提供对对象何时被释放的更确定性的理解。