我想知道xcode的游乐场中的编译流程 . 据我所知,它与Xcode中的相同,但根据游乐场的输出而令人困惑 .

import UIKit
// ARC
class Student {
    let name: String

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

    deinit {
        print("\(name) is being deinitialized")
    }
}

var reference1: Student?
var reference2: Student?
var reference3: Student?

reference1 = Student(name: "John Appleseed")
reference2 = reference1
reference3 = reference1

reference1 = nil
reference2 = nil
reference3 = nil

//Strong reference cycle

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 Clair")
unit4A = Apartment(unit: "4A")

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

john = nil
unit4A = nil

Output : -

John Appleseed is being initialized
John Clair is being deinitialized
Apartment 4A is being deinitialized
John Appleseed is being deinitialized

John Appleseed正在被取消初始化

应该打印之前

约翰克莱尔正在被取消初始化

由于 reference3 = nil 将调用类 StudentJohn Appleseed is being deinitialized 的deinit方法应该打印,之后 john = nil 将调用 Person 类的deinit方法并且 John Clair is being deinitialized 应该打印

Note : - 类Person和Apartment类的init方法在上面显示的示例中没有打印任何内容