Ответ
Время жизни переменной в Swift зависит от её типа и способа хранения.
Для ссылочных типов (классы):
- Управляются Automatic Reference Counting (ARC).
- Память освобождается, когда количество сильных ссылок (strong references) на объект становится равным нулю.
- Непосредственно перед освобождением вызывается метод
deinit.
Пример с retain cycle (утечка памяти):
class Person {
var apartment: Apartment?
deinit { print("Person освобождён") }
}
class Apartment {
var tenant: Person? // Сильная ссылка → retain cycle
deinit { print("Apartment освобождён") }
}
var john: Person? = Person()
var unit4A: Apartment? = Apartment()
john?.apartment = unit4A
unit4A?.tenant = john // Цикл сильных ссылок!
john = nil
unit4A = nil
// Ни один deinit не вызовется, память не освободится.
Решение: Использовать weak или unowned ссылки, чтобы разорвать цикл.
Для типов-значений (структуры, перечисления, кортежи):
- Существуют строго в своей области видимости (scope).
- Уничтожаются автоматически при выходе из этой области (например, при завершении функции).