Выбор ответа Middle SwiftUI спрашивают часто обновлено
Потеря состояния у @ObservedObject
Вопрос
View объявляет @ObservedObject var vm = ProfileViewModel(). Почему периодически сбрасывается загруженный профиль?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Родитель пересоздаёт view, а с ней и view model; владеть должен @StateObject. @ObservedObject не владеет объектом, он лишь подписывается.
Варианты ответа
- Родитель пересоздаёт view, а с ней и view model; владеть должен
@StateObjectправильный ответ @ObservedObjectхранит объект слабо, и ARC освобождает его при первой возможности- SwiftUI сбрасывает все
ObservableObjectпри уходе приложения в фон - View model нужно пометить
final, иначе SwiftUI не может отследить её изменения
Разбор
@ObservedObject не владеет объектом, он лишь подписывается. Инициализатор свойства выполняется каждый раз, когда родитель пересоздаёт структуру view, то есть часто. @StateObject создаёт объект один раз на идентичность view и хранит его. Для классов с @Observable владение выражается через @State. Слабого хранения и сброса в фоне нет, final на это не влияет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.