Где хранится strong-ссылка в Swift и как она управляет памятью?

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

Ответ

Место хранения: Сама strong-ссылка как переменная хранится в стеке (для локальных переменных) или в куче (если является свойством класса). Объект, на который она указывает, всегда размещается в куче (heap).

Принцип работы (ARC): Strong-ссылка увеличивает счетчик ссылок (retain count) объекта. Пока существует хотя бы одна strong-ссылка, объект не освобождается.

Пример:

class Person {
    let name: String
    init(name: String) { self.name = name }
}
// Создание strong-ссылок
var strongRef1: Person? = Person(name: "Alice") // retain count = 1
var strongRef2 = strongRef1 // retain count = 2 (новая strong-ссылка)

strongRef1 = nil // retain count = 1
strongRef2 = nil // retain count = 0 -> объект деаллоцируется

Ключевые особенности:

  1. По умолчанию: Все ссылки в Swift — strong.
  2. Управление памятью: Автоматическое (ARC). Присваивание увеличивает счетчик, обнуление переменной — уменьшает.
  3. Циклические ссылки: Могут возникнуть, если два объекта имеют strong-ссылки друг на друга. Решаются через weak или unowned.