Swift 内存管理将如何处理这种情况?

问题描述 投票:0回答:1

考虑:

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 memory-management memory-leaks
1个回答
0
投票

在 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
的想法是为开发人员提供对对象何时被释放的更确定性的理解。

© www.soinside.com 2019 - 2024. All rights reserved.