Что выведет код Middle ARC и циклы ссылок обновлено
Что выведет Swift: владелец и слабая обратная ссылка
Вопрос
Что выведет код?
final class Owner {
var pet: Pet?
deinit { print("Owner deinit") }
}
final class Pet {
weak var owner: Owner?
deinit { print("Pet deinit") }
}
var owner: Owner? = Owner()
var pet: Pet? = Pet()
owner!.pet = pet
pet!.owner = owner
pet = nil
print("pet = nil")
owner = nil
print("owner = nil")
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: pet = nil, Owner deinit, Pet deinit, owner = nil. После pet = nil питомца ещё держит владелец.
Что выведет
pet = nil
Owner deinit
Pet deinit
owner = nil
Разбор
После pet = nil питомца ещё держит владелец. Обратная ссылка слабая, поэтому owner = nil освобождает владельца: сначала выполняется его deinit, потом освобождаются его свойства, и питомец теряет последнюю сильную ссылку.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что выведет Swift: когда вызывается deinit
Следующий вопрос
Что выведет Swift: замыкание с weak self после освобождения
Ещё по теме «ARC и циклы ссылок»
- Когда нужен autoreleasepool в Swift
- Цикл ссылок через замыкание-свойство
- Почему делегат объявляют weak
- DispatchQueue.main.async и self
- Как найти утечку памяти в iOS-приложении
- Жизненный цикл объекта в Swift-рантайме
- Когда уместен unowned
- Задача на Swift: какие объекты утекут из-за циклов ссылок