Ответ
В 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) уничтожается, объект удаляется.