Как ARC действует с применением силы развернутого экземпляра - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь узнать, как именно работает ARC, поэтому я прочитал документацию Swift ARC , и я следовал примеру, который они приводят в документе, используя площадку:

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

Myвопрос в том, почему, когда я вызываю Person экземпляр john необязательно:

john?.apartment = unit4A

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

john!.apartment = unit4A

он не становитсяперераспределена.

1 Ответ

0 голосов
/ 17 февраля 2019

Тестирование вашего кода в простом проекте Xcode работало просто отлично, это проблема, связанная с обработкой объектов на игровых площадках.

Однако, когда deinit не вызывается, это, вероятно, проблема с циклом сохранения, поскольку ARC не может освободить сильные ссылки, поэтому не будет освобожден.

Проверьте этот ответ .
Также читайте больше о сохранении циклов здесь

...