В данном коде оба объекта освобождаются и с unowned, и с weak: Device удерживается только Individual. Различие проявится, если Device переживёт владельца.
Что меняется при замене unowned на weak в отношениях объектов
В данном коде оба объекта освобождаются и с 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.