Выбор ответа Middle SwiftUI спрашивают часто обновлено

Потеря состояния у @ObservedObject

Вопрос

View объявляет @ObservedObject var vm = ProfileViewModel(). Почему периодически сбрасывается загруженный профиль?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Родитель пересоздаёт view, а с ней и view model; владеть должен @StateObject. @ObservedObject не владеет объектом, он лишь подписывается.

Варианты ответа

  1. Родитель пересоздаёт view, а с ней и view model; владеть должен @StateObjectправильный ответ
  2. @ObservedObject хранит объект слабо, и ARC освобождает его при первой возможности
  3. SwiftUI сбрасывает все ObservableObject при уходе приложения в фон
  4. View model нужно пометить final, иначе SwiftUI не может отследить её изменения

Разбор

@ObservedObject не владеет объектом, он лишь подписывается. Инициализатор свойства выполняется каждый раз, когда родитель пересоздаёт структуру view, то есть часто. @StateObject создаёт объект один раз на идентичность view и хранит его. Для классов с @Observable владение выражается через @State. Слабого хранения и сброса в фоне нет, final на это не влияет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.