Сервис хранит 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 освободится штатно вместе с экраном
