Когда переменная освобождается из памяти в Swift?

Ответ

Время жизни переменной в 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 не парится. Просто сказка, а не жизнь.

Короче, запомни: классы — это как отношения, можно в говно завязнуть, если неаккуратно. А структуры — как одноразовые стаканчики, использовал и выкинул, без зазрения совести.