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

Утечка через NotificationCenter

Вопрос

Контроллер подписывается: token = NotificationCenter.default.addObserver(forName: .x, object: nil, queue: .main) { _ in self.refresh() }. Что не так?

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

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

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

Коротко

Правильный ответ: Центр держит замыкание, оно держит self; нужен removeObserver. Автоматическая отписка с iOS 9 касается селекторного API addObserver(:selector:name:object:).

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

  1. Центр держит замыкание, оно держит self; нужен removeObserverправильный ответ
  2. Ничего: с iOS 9 подписки удаляются автоматически при deinit
  3. Замыкание выполнится в фоновом потоке, а не на главном
  4. Токен нужно хранить как weak, иначе он удержит центр

Разбор

Автоматическая отписка с iOS 9 касается селекторного API addObserver(_:selector:name:object:). Блочный API возвращает токен, а центр держит замыкание, пока вы не вызовете removeObserver. Сильный захват self делает утечку. Нужно [weak self] и удаление токена. Очередь .main задана явно, так что замыкание выполнится на главной. Токен хранят сильно, иначе его нечем будет удалить.

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

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