Ответ
Время жизни переменной в 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).
- Уничтожаются автоматически при выходе из этой области (например, при завершении функции).
Ответ 18+ 🔞
А, слушай, про память в Swift, это же отдельная песня, блядь! Ну, короче, тут всё зависит от того, с чем имеешь дело — со ссылкой или со значением. Как с двумя разными мирами, ёпта.
Для этих ваших классов (ссылочные типы):
Тут всем заправляет ARC — счётчик ссылок, сука. Умная штука, но если накосячить — память потечёт, как решето.
Объект живёт, пока на него хоть кто-то сильно смотрит. Как только все отвязались — сразу 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 ссылки! Чтобы одна сторона не держала другую мёртвой хваткой.
А для типов-значений (структуры, перечисления): Тут вообще красота, блядь. Живут ровно столько, сколько им отведено в своей области видимости. Вышел из функции — всё, пиzдец, приехали. Автоматом всё подчистилось, как будто их и не было. Никаких циклов, ARC не парится. Просто сказка, а не жизнь.
Короче, запомни: классы — это как отношения, можно в говно завязнуть, если неаккуратно. А структуры — как одноразовые стаканчики, использовал и выкинул, без зазрения совести.