Что меняется при замене unowned на weak в отношениях объектов

В данном коде оба объекта освобождаются и с unowned, и с weak: Device удерживается только Individual. Различие проявится, если Device переживёт владельца.

Короткий ответ

Что ответить на собеседовании

В данном коде оба объекта освобождаются и с unowned, и с weak: Device удерживается только Individual. Различие проявится, если Device переживёт владельца.

Подробный разбор

Ответ с пояснениями

Условие

Вопрос: как изменится поведение программы, если вместо ссылки с модификатором unowned использовать weak? Рассмотрим пример на Swift, где один объект хранит сильную ссылку на другой, а второй объект держит обратную ссылку к первому.

class Individual {
    var fullName: String
    var device: Device?
    init(fullName: String) { self.fullName = fullName }
}

class Device {
    var type: String
    unowned var owner: Individual
    init(type: String, owner: Individual) {
        self.type = type
        self.owner = owner
    }
}

var individual: Individual? = Individual(fullName: "Alice")
individual?.device = Device(type: "iPhone", owner: individual!)
individual = nil

Опишите, что произойдёт с объектами после установки individual = nil при текущем использовании unowned, а затем объясните, как изменится ситуация, если заменить unowned var owner: Individual на weak var owner: Individual?.

Ответ

В данном коде оба объекта освобождаются и с unowned, и с weak: Device удерживается только Individual. Различие проявится, если Device переживёт владельца.

После individual = nil последняя сильная ссылка на Individual исчезает; при его освобождении освобождается и принадлежащий ему Device. Обратная unowned-ссылка не удерживает владельца, поэтому цикла нет. Если Device дополнительно удерживает другой объект, обращение к его owner после смерти Individual с unowned вызовет runtime-ошибку. С weak var owner: Individual? ссылка станет nil и её можно безопасно проверить. Замена модификатора требует изменения типа и обработки optional.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее