Утечка через NotificationCenter
Вопрос
Контроллер подписывается: token = NotificationCenter.default.addObserver(forName: .x, object: nil, queue: .main) { _ in self.refresh() }. Что не так?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Центр держит замыкание, оно держит
self; нуженremoveObserverправильный ответ - Ничего: с iOS 9 подписки удаляются автоматически при
deinit - Замыкание выполнится в фоновом потоке, а не на главном
- Токен нужно хранить как
weak, иначе он удержит центр
Разбор
Автоматическая отписка с iOS 9 касается селекторного API addObserver(_:selector:name:object:). Блочный API возвращает токен, а центр держит замыкание, пока вы не вызовете removeObserver. Сильный захват self делает утечку. Нужно [weak self] и удаление токена. Очередь .main задана явно, так что замыкание выполнится на главной. Токен хранят сильно, иначе его нечем будет удалить.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Инструменты для поиска проблем с памятью
Следующий вопрос
Порядок событий при освобождении объекта
Ещё по теме «ARC и циклы ссылок»
- Когда нужен autoreleasepool в Swift
- Цикл ссылок через замыкание-свойство
- Почему делегат объявляют weak
- DispatchQueue.main.async и self
- Как найти утечку памяти в iOS-приложении
- Жизненный цикл объекта в Swift-рантайме
- Когда уместен unowned
- Задача на Swift: какие объекты утекут из-за циклов ссылок