По порядку Senior ARC и циклы ссылок обновлено
Порядок событий при освобождении объекта
Вопрос
Расставьте по порядку, что происходит, когда исчезает последняя сильная ссылка на объект класса.
Попробуйте сами
Расставьте шаги по порядку стрелками.
- 1Память объекта возвращается, когда не осталось unowned-ссылок
- 2Выполняется тело
deinit(сначала подкласса, потом суперкласса) - 3Объект помечается как деинициализируемый: weak-ссылки начинают возвращать
nil - 4Счётчик сильных ссылок становится равен нулю
- 5Освобождаются хранимые свойства объекта
Показать ответ и разбор
Коротко
Weak-ссылки обнуляются раньше, чем выполнится deinit, поэтому из deinit нельзя «спасти» объект через weak. Свойства освобождаются после тела deinit, и в нём к ним ещё можно обращаться.
Правильный порядок
- 1Счётчик сильных ссылок становится равен нулю
- 2Объект помечается как деинициализируемый: weak-ссылки начинают возвращать
nil - 3Выполняется тело
deinit(сначала подкласса, потом суперкласса) - 4Освобождаются хранимые свойства объекта
- 5Память объекта возвращается, когда не осталось unowned-ссылок
Разбор
Weak-ссылки обнуляются раньше, чем выполнится deinit, поэтому из deinit нельзя «спасти» объект через weak. Свойства освобождаются после тела deinit, и в нём к ним ещё можно обращаться. Освобождение памяти откладывается, пока есть unowned-ссылки.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Утечка через NotificationCenter
Следующий вопрос
Что выведет Swift: когда вызывается deinit
Ещё по теме «ARC и циклы ссылок»
- Когда нужен autoreleasepool в Swift
- Цикл ссылок через замыкание-свойство
- Почему делегат объявляют weak
- DispatchQueue.main.async и self
- Как найти утечку памяти в iOS-приложении
- Жизненный цикл объекта в Swift-рантайме
- Когда уместен unowned
- Задача на Swift: какие объекты утекут из-за циклов ссылок