Что выведет код 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 ошибок.