Цикла сильных ссылок здесь нет: Person сильно удерживает Pet, а Pet слабо ссылается на Person. weak owner автоматически станет nil после освобождения владельца.
Определите недостатки в представленном Swift‑фрагменте №1
Цикла сильных ссылок здесь нет: Person сильно удерживает Pet, а Pet слабо ссылается на Person. weak owner автоматически станет nil после освобождения владельца.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В приведённом примере создаются два класса — Person и Pet. Класс Person хранит имя и опциональную ссылку на питомца, а класс Pet хранит имя и слабую ссылку на владельца. После создания экземпляров john (персона) и dog (питомца) они взаимно связываются: john.pet = dog и dog.owner = john. Проанализируйте код и укажите, какие потенциальные проблемы могут возникнуть (например, связанные с управлением памятью, сильными/слабыми ссылками, опциональностью и т.п.).
import Foundation
class Person {
var name: String
var pet: Pet?
init(name: String) {
self.name = name
}
}
class Pet {
var name: String
weak var owner: Person?
init(name: String) {
self.name = name
}
}
var john = Person(name: "John")
var dog = Pet(name: "Buddy")
john.pet = dog
dog.owner = john
Ответ
Цикла сильных ссылок здесь нет: Person сильно удерживает Pet, а Pet слабо ссылается на Person. weak owner автоматически станет nil после освобождения владельца.
Показанные объявления корректны: weak применяется к optional-ссылке на класс, поэтому исчезновение владельца представимо. Само наличие pet и owner не является утечкой. Возможные улучшения относятся к модели: двусторонние связи сейчас можно рассинхронизировать при замене питомца, свойства полностью доступны для записи, политика смены владельца не определена. При обращении к dog.owner требуется безопасная обработка nil. Не стоит заменять weak на unowned без гарантии времени жизни Person.