关于Swift弱引用的问题


class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { print("\(name) is being deinitialized") }
}

class Apartment {
    let unit: String
    init(unit: String) { self.unit = unit }
    weak var tenant: Person?
    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
// 打印“John Appleseed is being deinitialized”

unit4A!.tenant

Swift官方文档里说,把变量john赋值为nil,unit4A!.tenant对它的弱引用就会消失,unit4A!.tenant的值会变成nil,然而并没有变成nil。求解🙏

你是在Playground里测试的吗?如果是,请更改为如下代码测试:

PlaygroundPage.current.needsIndefiniteExecution = true

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { print("\(name) is being deinitialized") }
}

class Apartment {
    let unit: String
    init(unit: String) { self.unit = unit }
    weak var tenant: Person?
    deinit { print("Apartment \(unit) is being deinitialized") }
}

var john: Person?
var unit4A: Apartment?

func test() {
    john = Person(name: "John Appleseed")
    unit4A = Apartment(unit: "4A")

    john!.apartment = unit4A
    unit4A!.tenant = john

    john = nil
    // 打印“John Appleseed is being deinitialized”
}

test()
unit4A!.tenant

可以看到最后 unit4A!.tenant 为 nil。

img