3

我正在尝试了解 ARC 的工作原理,因此我阅读了Swift ARC 文档,并按照他们在使用 Playground 的文档中提供的示例进行操作:

class Person {
    let name: String
    weak var apartment: Apartment?

    init(name: String) { self.name = name }
    deinit { print("\(name) is being deinitialized") }
}

class Apartment {
    let unit: String
    weak var tenant: Person?

    init(unit: String) { self.unit = unit }
    deinit { print("Apartment \(unit) is being deinitialized") }
}

var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john?.apartment = unit4A
unit4A?.tenant = john

john = nil
unit4A = nil

我的问题是为什么当我调用Person实例john可选时:

john?.apartment = unit4A

对象被释放,但是当我调用它时强制解包:

john!.apartment = unit4A

它不会被释放。

4

1 回答 1

2

在一个简单的 Xcode 项目中测试你的代码工作得很好,这是一个与 Playground 处理对象相关的问题。

然而,当 adeinit未被调用时,它可能是一个保留周期问题,因为ARC无法释放强引用,因此不会被释放。

看看这个答案还可以在此处
阅读有关保留周期的更多信息

于 2019-02-17T10:57:09.693 回答