Могут ли экземпляры классов в Swift храниться в стеке?

Ответ

Нет, экземпляры классов в Swift всегда хранятся в куче (heap). Это обусловлено их ссылочной семантикой и необходимостью динамического управления временем жизни.

Почему? Классы имеют ссылочную семантику. Несколько переменных могут ссылаться на один и тот же экземпляр в памяти. Стек работает по принципу LIFO (последним пришел — первым ушел) и управляется автоматически при входе/выходе из функций, что не подходит для сложного жизненного цикла общих объектов.

Что может храниться в стеке?

  • Экземпляры структур (struct) и перечислений (enum) с семантикой копирования (value types), если они:
    • Не привязаны к классу (например, не являются его свойством).
    • Не захвачены замыканием, которое может пережить текущую область видимости.

Пример:

class MyClass { } // Экземпляр будет в куче
struct MyStruct { } // Экземпляр может быть в стеке

let object = MyClass() // Выделение памяти в куче
let value = MyStruct() // Скорее всего, размещение в стеке (если локальная переменная)

Исключение: Структура, содержащая свойство-класс, сама может быть размещена в стеке, но данные этого свойства (объект класса) всё равно будут находиться в куче.

Ответ 18+ 🔞

Да ты послушай, какая дичь! Сижу тут, думаю, про Swift, а тут как обухом по голове — экземпляры классов, блядь, всегда в куче! Вообще всегда, нахуй! Никаких вариантов.

А почему, спрашивается? Да потому что они, сука, ссылочные! Как этот один чувак, на которого десять баб указывают: «Вот он, наш общий!» И где его, блядь, хранить? На стеке, что ли? Так стек же — это как очередь в столовую: зашёл, поел, вышел — место освободил. А этот наш «общий чувак» (экземпляр класса) должен жить, пока хоть одна баба (переменная) на него смотреть будет. Вот и таскают его туда-сюда в куче, пока ARC не придет и не скажет: «Всё, падла, свободен».

А в стеке что может быть? Да обычные, не замутнённые структуры да енамы! Те, что сами по себе, как честные одиночки. Не привязались к классу-суке, не попали в плен к замыканию, которое живёт дольше них. Вот они — да, могут на стеке спокойно пожить.

Смотри, вот пример, чтобы совсем пиздец понятно стало:

class MyClass { } // Этот красавец — сразу в кучу, блядь!
struct MyStruct { } // А этот скромняга — может и на стек приземлиться.

let object = MyClass() // Щас где-то в куче место проебут под него.
let value = MyStruct() // А этот, скорее всего, тут же, на стеке, скромненько.

Но вот что забавно, ёпта! Возьмём структуру, а в неё засунем свойство-класс. Сама структура может на стеке сидеть, как милая, а вот её содержимое — этот ёбаный объект класса — всё равно будет в куче торчать, как гвоздь в жопе! Парадокс, блядь!