Где хранятся ссылки на объекты (экземпляры классов) в Swift?

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

Ответ

В Swift строго разделяются сам объект (данные) и ссылка на него.

  • Ссылка (сама переменная) хранится там, где она объявлена:

    • Если это локальная переменная функции — в стеке.
    • Если это свойство другого объекта — в куче, внутри этого объекта.
    • Если это глобальная/статическая переменная — в data segment.
  • Сам объект (экземпляр класса) всегда хранится в куче (Heap).

Пример с ARC (Automatic Reference Counting):

class User {
    let name: String
    init(name: String) { self.name = name; print("(name) создан") }
    deinit { print("(name) уничтожен") }
}

func createUser() {
    let userRef = User(name: "Alice") // 1. Объект User создается в КУЧЕ.
                                        // 2. Ссылка `userRef` живет в СТЕКЕ (локальная переменная).
    print(userRef.name)
} // 3. При выходе из функции ссылка `userRef` уничтожается (убирается из стека).
   // 4. ARC видит, что ссылок на объект "Alice" не осталось, и освобождает память в куче.

createUser()
// Вывод:
// Alice создан
// Alice
// Alice уничтожен

Ключевой вывод: Управление памятью в Swift (ARC) работает со счетчиком ссылок на объект в куче. Когда последняя ссылка (где бы она ни хранилась — в стеке, куче или data segment) уничтожается, объект удаляется.