0Pricing
Swift Academy · Урок

Циклы удержания: причины и обнаружение

Находите циклы удержания между объектами и замыканиями с помощью Instruments.

«Циклы удержания: причины и обнаружение» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Добро пожаловать

Цикл удержания возникает, когда два или более объекта содержат сильные ссылки друг на друга, не позволяя ARC достичь нулевого счётчика, — это приводит к утечке памяти.

Простой цикл из двух объектов

```swift class Owner { var pet: Pet? } class Pet { var owner: Owner? } var o: Owner? = Owner() var p: Pet? = Pet() o?.pet = p // Owner → Pet (strong) p?.owner = o // Pet → Owner (strong) o = nil; p = nil // Neither deinit called — cycle! ```

Цикл родитель-потомок

```swift class Node { var children: [Node] = [] var parent: Node? // strong → cycle with parent } let root = Node() let child = Node() root.children.append(child) child.parent = root // cycle ```

Цикл захвата замыканием

```swift class ViewController { var onComplete: (() -> Void)? func setup() { onComplete = { // closure strongly captures self self.doWork() // ← cycle! } } } ```

Цикл в шаблоне делегата

```swift protocol TaskDelegate: AnyObject { func didFinish() } class Task { var delegate: TaskDelegate? // if strong → potential cycle } class Manager: TaskDelegate { var task = Task() init() { task.delegate = self } // Manager → Task → Manager } ```

Обнаружение с помощью Instruments

Используйте Xcode Instruments → Leaks: 1. Запустите приложение в Instruments 2. Нажмите на инструмент Leaks 3. Красные отметки указывают на объекты с утечками 4. Раскройте подробности, чтобы увидеть граф ссылок Другой способ: задайте `deinit { print(...) }` и проверьте, вызывается ли он.

Обнаружение с помощью графа памяти Xcode

В отладчике Xcode выберите Debug > Memory Graph Debugger. Нажмите на объект с утечкой, чтобы увидеть цепочку его ссылок — в графе цикл будет виден как замкнутая петля.

Распространённые шаблоны циклов

• Делегат хранит сильную ссылку на делегата • Замыкание сильно захватывает `self` • Двунаправленные сильные ссылки родителя и потомка • Наблюдатель NotificationCenter хранит замыкание, захватывающее self • Цель Timer — `self` (сильная ссылка)

Цикл удержания Timer

```swift class Poller { var timer: Timer? func start() { timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in self?.poll() // weak self breaks cycle } } deinit { timer?.invalidate() } } ```

Цикл NotificationCenter

```swift class Listener { var token: NSObjectProtocol? init() { token = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue: .main) { [weak self] _ in self?.refresh() } } deinit { NotificationCenter.default.removeObserver(token!) } } ```

Быстрая проверка

Что такое цикл удержания в ARC?

Итоги

Основные выводы: • Циклы удержания: взаимные сильные ссылки → ни один объект не освобождается • Часто встречаются в делегатах, замыканиях и двунаправленных связях родитель—потомок • Обнаруживайте их с помощью инструментов анализа утечек или графа памяти Xcode • Исправляйте с помощью ссылок `weak` или `unowned` • Таймеры и NotificationCenter также вызывают циклы — разрывайте их с помощью `[weak self]` Далее: слабые ссылки и ссылки без владельца.

Часто задаваемые вопросы

Урок «Циклы удержания: причины и обнаружение» бесплатный?

Да — полный текст урока «Циклы удержания: причины и обнаружение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Циклы удержания: причины и обнаружение»?

Находите циклы удержания между объектами и замыканиями с помощью Instruments. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Циклы удержания: причины и обнаружение»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Как ARC подсчитывает ссылки
  2. Циклы удержания: причины и обнаружение
  3. Ссылки weak и unowned
  4. Списки захвата замыканий и [weak self]
← Назад к Swift Academy