Выбор ответа Junior ARC и циклы ссылок спрашивают часто обновлено
Цикл ссылок через замыкание-свойство
Вопрос
В final class ProfileVM есть var onUpdate: (() -> Void)? и в init присваивается onUpdate = { self.reload() }. Что происходит?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Цикл: объект держит замыкание, а оно держит self. Escaping-замыкание по умолчанию захватывает self сильно.
Варианты ответа
- Ничего страшного: escaping-замыкания держат
selfслабо - Ошибка компиляции: в
initнельзя использоватьself - Цикл: объект держит замыкание, а оно держит
selfправильный ответ - Утечка будет только в отладочной сборке, в релизе нет
Разбор
Escaping-замыкание по умолчанию захватывает self сильно. Объект хранит замыкание в свойстве, и получается цикл объект → замыкание → объект. Лечится [weak self] (или [unowned self], если замыкание точно не переживёт объект). Использовать self в init после инициализации всех свойств можно. Утечка будет и в релизе.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «ARC и циклы ссылок»
- DispatchQueue.main.async и self
- Как найти утечку памяти в iOS-приложении
- Жизненный цикл объекта в Swift-рантайме
- Когда уместен unowned
- Задача на Swift: какие объекты утекут из-за циклов ссылок
- Инструменты для поиска проблем с памятью
- Утечка через NotificationCenter
- Порядок событий при освобождении объекта