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

Сервис хранит completion, экран закрыли — почему ViewModel не освобождается

ProfileService сохраняет completion в своё свойство и вызывает его, когда придёт ответ сервера.

final class ProfileService {
    private var completion: ((User) -> Void)?

    func fetch(completion: @escaping (User) -> Void) {
        self.completion = completion
        // вызовет completion после ответа сервера
    }
}

final class ProfileViewModel {
    private let service = ProfileService()
    var onUpdate: (() -> Void)?

    func load() {
        service.fetch { user in
            self.render(user)
            self.onUpdate?()
        }
    }

    private func render(_ user: User) { }
}

Пользователь открыл экран, дождался загрузки и вернулся назад. Что произойдёт с памятью?

  • Утечки нет: замыкание передано параметром, ARC освободит его сразу после вызова fetch
  • ViewModel не освободится: service держит замыкание, а замыкание — саму ViewModel
  • Утечки нет: ARC умеет разрывать такие циклы при выходе объекта из области видимости
  • Утечёт только service, ViewModel освободится штатно вместе с экраном

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

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

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

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