Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про IOS: retain, cycle

Что такое retain cycle и как его избежать?

Вопрос проверяет знание одной из самых частых причин утечек памяти в iOS-приложениях.

Короткий ответ

Retain cycle возникает, когда два или более объекта удерживают друг друга сильными ссылками. В результате ARC не может освободить память. Чаще всего это происходит между view controller и замыканиями или делегатами. Для решения используют weak или unowned ссылки. Важно осознанно управлять владением объектами.

Длинный ответ

Retain cycle — это логическая ошибка владения, которую ARC не может исправить автоматически.

Определение

Retain cycle — ситуация, при которой объекты образуют замкнутую цепочку strong ссылок и никогда не освобождаются.

Классический пример

Самый частый кейс — замыкание, захватывающее self.

class ProfileViewModel {
    var onUpdate: (() -> Void)?

    func load() {
        onUpdate = {
            self.refresh()
        }
    }

    func refresh() {}
}

Здесь:

  1. ProfileViewModel сильно держит onUpdate.

  2. Замыкание сильно держит self.

  3. Объект никогда не освобождается.

Как избежать retain cycle

Перед выбором решения важно понять, гарантирован ли жизненный цикл объекта.

1. weak

Используется, когда объект может быть уничтожен.

onUpdate = { [weak self] in
    self?.refresh()
}

Особенности:

  1. Ссылка может стать nil.

  2. Безопасна для UI и асинхронных операций.

2. unowned

Используется, если объект точно жив дольше замыкания.

onUpdate = { [unowned self] in
    refresh()
}

Риск:

  • крэш при обращении к уничтоженному объекту.

3. Делегаты

Делегаты почти всегда объявляются как weak.

weak var delegate: SomeDelegate?

Где retain cycle встречается чаще всего

  1. ViewController ↔ ViewModel.

  2. ViewController ↔ Closure.

  3. Parent ↔ Child.

  4. Таймеры и NotificationCenter без отписки.

Как находить проблемы

  1. Instruments → Leaks / Allocations.

  2. Логи в deinit.

  3. Проверка жизненного цикла экранов.

Практический вывод

Retain cycle — одна из главных причин утечек памяти. Осознанное использование weak и unowned, а также регулярная проверка deinit — обязательная практика в iOS-разработке.

  • Аватар

    iOS Guru

    Roman Isakov

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • IOS

    IOS

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

#retain

#cycle

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

  • Аватар

    iOS Guru

    Roman Isakov

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