DispatchQueue.main.async и self
Вопрос
Есть ли цикл ссылок в DispatchQueue.main.async { self.label.text = "Готово" } внутри контроллера?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Да: при любом захвате
selfв замыкании нужен[weak self] - Да: очередь навсегда сохраняет все выполненные замыкания
- Нет: главная очередь держит замыкания слабо
- Нет: очередь держит замыкание лишь до выполненияправильный ответ
Разбор
Цикл возникает, когда объект прямо или косвенно хранит замыкание, которое держит объект. Здесь замыкание хранит очередь, и только до выполнения. self проживёт чуть дольше, обычно это нормально. [weak self] полезен, если работа долгая (сеть, тяжёлые вычисления) и результат не нужен закрытому экрану. Очередь держит замыкание сильно, иначе оно бы исчезло до выполнения.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Почему делегат объявляют weak
Следующий вопрос
Как найти утечку памяти в iOS-приложении
Ещё по теме «ARC и циклы ссылок»
- Когда нужен autoreleasepool в Swift
- Цикл ссылок через замыкание-свойство
- Жизненный цикл объекта в Swift-рантайме
- Когда уместен unowned
- Задача на Swift: какие объекты утекут из-за циклов ссылок
- Инструменты для поиска проблем с памятью
- Утечка через NotificationCenter
- Порядок событий при освобождении объекта