Вопрос проверяет умение управлять захватом self и другими объектами внутри замыканий, которые выполняются асинхронно.
В escaping-замыканиях захват self по умолчанию сильный, что может привести к retain-циклу. Чтобы избежать, используют [weak self] или [unowned self] в capture-list, проверяют self в блоке и корректно обрабатывают его отсутствие.
Проблема retain-цикла:
class VC {
func load() {
network.request(.getUsers) { users in
self.users = users // self захватывается сильно
}
}
}Использование [weak self]:
network.request(.getUsers) { [weak self] users in
guard let self = self else { return }
self.users = users
}[unowned self]:
Можно применять, когда self гарантированно жив на момент выполнения.
Тогда не делают guard.
Пример с таймером:
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in
self?.tick()
}Вывод:
Правильный выбор weak или unowned в capture-list предотвращает утечки и обеспечивает коректный жизненный цикл объектов.