Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Swift : closure, retain, cycle, weak, unowned

Как избежать утечек памяти при работе с escaping-замыканиями?

Вопрос проверяет умение управлять захватом 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 предотвращает утечки и обеспечивает коректный жизненный цикл объектов.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • Swift

    Swift

Ключевые слова

#closure

#retain

#cycle

#weak

#unowned

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.