Почему я могу получить доступ к объекту после вызова метода deinit?

Я скопировал большую часть этого кода из раздела Unownowned References в Swift Guide и запустил его на игровой площадке…

class Customer {
    let name: String
    var card: CreditCard?

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

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }
    deinit { print("Card #(number) is being deinitialized") }
}

var john: Customer?

john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)

var card = john!.card!

john = nil

card.customer.name

john установите значение nilresults in…

“John Appleseed » деинициализируетсяn»

Но потом получение nameимущества дает…

«John Appleseed»

Таким образом, клиентский экземпляр все еще доступен, несмотря на то, что он деинициализирован!

Не должно ли это привести к нулевому исключению ссылки? Об этом говорится в руководстве…

Обратите внимание, что Swift гарантирует, что ваше приложение будет аварийно завершить работу, если вы попытаетесь
доступ к ссылке Без Имени после экземпляра, на который она ссылается
освободившему. Вы никогда не столкнетесь с неожиданным поведением в этом
ситуация. Ваше приложение всегда будет аварийно завершать работу надежно, хотя вы должны,
конечно, не допустить этого.

Таким образом, я предполагаю, что он не должен был быть освобожден. И все же, руководство также говорит,

Deinitializer вызывается непосредственно перед экземпляром класса
освободившему.

1 ответ