Ответ
Да, объект будет немедленно освобожден (деинициализирован) при обнулении последней сильной ссылки. Слабые (weak) и бесхозные (unowned) ссылки не увеличивают счетчик ссылок (retain count), поэтому не влияют на время жизни объекта.
Механика:
class Example { deinit { print("Объект освобожден") } }
var strongRef: Example? = Example() // Retain count = 1
weak var weakRef1 = strongRef // Retain count = 1
weak var weakRef2 = strongRef // Retain count = 1
weak var weakRef3 = strongRef // Retain count = 1
unowned var unownedRef = strongRef! // Retain count = 1
strongRef = nil // Retain count становится 0 -> объект освобождается.
// Консоль: "Объект освобожден"
// Последствия:
print(weakRef1) // nil
print(weakRef2) // nil
print(weakRef3) // nil
// print(unownedRef) // КРАШ! Попытка доступа к освобожденному объекту через unowned.
Ключевые различия ссылок:
strong: Удерживает объект живым. Увеличиваетretain count.weak: Не удерживает объект. Автоматически становитсяnilпосле освобождения объекта. Безопасна.unowned: Не удерживает объект. Не становитсяnil. Предполагает, что объект проживет дольше ссылки. Опасна при неправильном использовании (краш).
Вывод: Для освобождения памяти важен только счетчик сильных ссылок.