Ответ
Reference types (классы, замыкания) хранятся в куче (heap), а переменные, содержащие ссылки на них, — в стеке (stack).
Почему так?
- Куча позволяет выделять память динамически и хранить объекты с неопределенным временем жизни.
- Стек хранит локальные переменные и указатели (адреса памяти), что обеспечивает быстрый доступ и автоматическое управление.
Пример:
class Person {
var name: String
init(name: String) { self.name = name }
}
// person1 в стеке хранит указатель на объект Person в куче
let person1 = Person(name: "Alice")
// person2 копирует ссылку, а не объект
var person2 = person1
person2.name = "Bob"
print(person1.name) // "Bob" — оба указателя ссылаются на один объект
Управление памятью: Swift использует ARC (Automatic Reference Counting) для автоматического освобождения памяти в куче, когда счетчик ссылок на объект становится нулевым.
Ответ 18+ 🔞
Да блядь, ну вот, сидишь ты такой, кодишь на Swift, и тут бац — вопрос про память. А память, она, сука, как квартира: есть стек — это типа прихожая, всё под рукой, быстро взял, быстро положил. А есть куча — это как кладовка нахуй, туда складываешь всё большое и непонятное, что потом ещё искать надо.
Так вот, эти ваши классы да замыкания — они как тот диван из Икеи, который в прихожую не влезает. Их пихают в кучу, в эту самую кладовку-свалку. А в стеке, в прихожей, лежит только бумажка с адресом, где этот диван валяется. Эта бумажка — ссылка, она маленькая, её быстро прочитать.
А зачем так, блядь, усложнять?
- Куча — она терпила, блядь. Туда можно пихать что угодно и когда угодно, объекты там живут, пока на них есть спрос.
- Стек — шустрый, как киберспортсмен на кофеине. Локальные переменные, адреса — всё подчищается автоматом, когда функция отработала. Красота!
Смотри, как это выглядит в коде, ёпта:
class Person {
var name: String
init(name: String) { self.name = name }
}
// person1 — это бумажка в стеке. На бумажке адрес, где в куче лежит реальный чувак "Alice"
let person1 = Person(name: "Alice")
// person2 — это ксерокс той же бумажки. Тот же адрес, та же куча!
var person2 = person1
person2.name = "Bob" // Пришли по адресу и переименовали чувака на месте
print(person1.name) // "Bob" — ага, сука, сюрприз! Оба документа ведут в одну квартиру!
А как же мусор убирают?
А, это гениально, блядь! Swift использует ARC (Automatic Reference Counting). Это как система учёта: на каждый объект в куче вешают счётчик. Каждая новая бумажка-ссылка (как person2) — это +1 к счётчику. Выбросил бумажку — -1. Когда счётчик ноль, объект в куче понимает, что он никому не нужен, и самоуничтожается, освобождая память. Автоматически, блядь! Ни тебе ручного управления, ни утечек (в идеале, конечно, ха-ха).
Вот и вся магия, ёбушки-воробушки. Стек — быстрый и чёткий, куча — вместительная и гибкая. А ARC — это дворник, который следит, чтобы в куче не превратилось в свалку.