Вступить в клуб →
средняявопросCombine: издатели, подписки и операторы

ViewModel с подпиской на таймер не освобождается после закрытия экрана

final class OfferViewModel: ObservableObject {
    @Published var secondsLeft = 600
    private var cancellables = Set<AnyCancellable>()

    init() {
        Timer.publish(every: 1, on: .main, in: .common).autoconnect()
            .sink { _ in self.secondsLeft -= 1 }
            .store(in: &cancellables)
    }
    deinit { print("OfferViewModel deinit") }
}

Экран акции закрыли, а deinit не печатается, таймер продолжает тикать. Почему?

  • Цикл: self хранит подписку, подписка хранит self
  • Timer.publish держит ViewModel через RunLoop
  • Set<AnyCancellable> не освобождается сам
  • @Published удерживает объект до отписки

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела