Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Как возникают retain cycle и как их находить?

Вопрос проверяет умение находить утечки памяти и понимать, почему объекты не освобождаются.

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

Retain cycle возникает, когда два или более объекта удерживают друг друга сильными ссылками. В результате retain count никогда не становится равным нулю. Такие объекты не освобождаются, и возникает утечка памяти. Чаще всего retain cycle появляются в замыканиях, делегатах и взаимных ссылках между объектами.

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

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

Определение

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

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

Типовая схема:

  • A сильно ссылается на B

  • B сильно ссылается на A

Оба объекта:

  • имеют retain count ≥ 1

  • никогда не доходят до нуля

Самый частый источник — замыкания

Замыкания:

  • захватывают self по умолчанию сильно

  • часто хранятся дольше, чем ожидается

Пример логики (упрощённо):

class Example {
    var callback: (() -> Void)?

    func setup() {
        callback = {
            // self используется здесь
            self.doSomething()
        }
    }
}

Здесь:

  • self удерживает callback

  • callback удерживает self

Другие типовые источники

  1. Делегаты без weak

  2. Таймеры (Timer)

  3. NotificationCenter

  4. Long-living сервисы и синглтоны

Как находить retain cycle

1) По deinit

Если deinit не вызывается:

  • почти наверняка есть утечка

2) Memory Graph Debugger

Инструмент Xcode позволяет:

  • увидеть цепочки ссылок

  • найти цикл

  • понять, кто кого удерживает

3) Instruments

  • Leaks

  • Allocations

Используются для поиска долгоживущих объектов.

Как предотвращать

  • использовать [weak self] или [unowned self]

  • делать делегаты weak

  • явно разрывать связи при завершении работы

Краткий вывод

Retain cycle возникают из-за логических циклов сильных ссылок. Их нельзя “починить” ARC — только правильной архитектурой и внимательной работой с ссылками.

  • Аватар

    iOS Guru

    Roman Isakov

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    9

Навыки

  • IOS

    IOS

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

#retain

#cycle

#memory

#leak

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

  • Аватар

    iOS Guru

    Roman Isakov

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