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

«Когда переменная освобождается из памяти в Swift?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Время жизни переменной в 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).
  • Уничтожаются автоматически при выходе из этой области (например, при завершении функции).