Выбор ответа Junior ARC и циклы ссылок спрашивают часто обновлено

Цикл ссылок через замыкание-свойство

Вопрос

В final class ProfileVM есть var onUpdate: (() -> Void)? и в init присваивается onUpdate = { self.reload() }. Что происходит?

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

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

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

Коротко

Правильный ответ: Цикл: объект держит замыкание, а оно держит self. Escaping-замыкание по умолчанию захватывает self сильно.

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

  1. Ничего страшного: escaping-замыкания держат self слабо
  2. Ошибка компиляции: в init нельзя использовать self
  3. Цикл: объект держит замыкание, а оно держит selfправильный ответ
  4. Утечка будет только в отладочной сборке, в релизе нет

Разбор

Escaping-замыкание по умолчанию захватывает self сильно. Объект хранит замыкание в свойстве, и получается цикл объект → замыкание → объект. Лечится [weak self] (или [unowned self], если замыкание точно не переживёт объект). Использовать self в init после инициализации всех свойств можно. Утечка будет и в релизе.

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

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