Выбор ответа Middle ARC и циклы ссылок обновлено

DispatchQueue.main.async и self

Вопрос

Есть ли цикл ссылок в DispatchQueue.main.async { self.label.text = "Готово" } внутри контроллера?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Нет: очередь держит замыкание лишь до выполнения. Цикл возникает, когда объект прямо или косвенно хранит замыкание, которое держит объект.

Варианты ответа

  1. Да: при любом захвате self в замыкании нужен [weak self]
  2. Да: очередь навсегда сохраняет все выполненные замыкания
  3. Нет: главная очередь держит замыкания слабо
  4. Нет: очередь держит замыкание лишь до выполненияправильный ответ

Разбор

Цикл возникает, когда объект прямо или косвенно хранит замыкание, которое держит объект. Здесь замыкание хранит очередь, и только до выполнения. self проживёт чуть дольше, обычно это нормально. [weak self] полезен, если работа долгая (сеть, тяжёлые вычисления) и результат не нужен закрытому экрану. Очередь держит замыкание сильно, иначе оно бы исчезло до выполнения.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.