Ответ
Место хранения переменной определяется её типом (value type / reference type) и способом объявления.
| Тип / Объявление | Область памяти | Управление памятью | Особенности |
|---|---|---|---|
Локальные переменные (value types)let x = 5, var arr = [1,2] |
Стек (Stack) | Автоматическое (при выходе из scope) | Быстрый доступ, размер известен на этапе компиляции. |
Экземпляры классов (reference types)let object = MyClass() |
Куча (Heap) | Автоматически (ARC) | Сам объект в куче. Переменная object — это ссылка, хранящаяся в стеке. |
Глобальные и статические переменныеlet appName = "MyApp"static let id = 123 |
Data Segment | Время жизни программы | Выделяется при запуске приложения. |
Почему это важно?
- Стек: Очень быстрый, но ограниченный по размеру. Идеален для временных данных.
- Куча: Гибкий (динамическое выделение), но медленнее и требует управления через ARC (Automatic Reference Counting).
- Data Segment: Для данных, которые должны существовать всё время работы приложения.
Пример, иллюстрирующий разницу:
struct Point { var x, y: Int } // Value type
class Label { var text: String } // Reference type
func test() {
let point = Point(x: 0, y: 0) // `point` и его данные (0,0) — в стеке.
let label = Label(text: "Hi") // Ссылка `label` — в стеке. Сам объект Label — в куче.
} // Здесь `point` уничтожается. Для `label` ARC уменьшает счетчик ссылок на объект в куче.