Какие данные хранятся в куче (heap) в iOS/macOS?

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

Ответ

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

Что хранится в куче:

  • Экземпляры классов (reference types) в Swift.
  • Замыкания (closures), захватывающие контекст.
  • Объекты Foundation (NS-объекты, такие как NSArray, NSDictionary, NSString).
  • Буферы для коллекций (например, элементы внутри Array или Dictionary, если они являются ссылочными типами).
  • Любые другие данные, выделенные с помощью malloc или аналогичных функций.

Ключевые особенности кучи:

  • Ручное или автоматическое управление памятью: Требует использования ARC (Automatic Reference Counting) в Swift или ручного retain/release в Objective-C.
  • Разделяемые данные: Несколько переменных могут хранить ссылки на один и тот же объект в куче.
  • Динамический размер: Размер кучи ограничен лишь доступной виртуальной памятью устройства.
  • Более медленный доступ: Выделение и освобождение памяти сложнее, чем в стеке.

Пример:

class Person { // Reference Type
    var name: String
    init(name: String) { self.name = name }
}

// Объект `Person` создаётся и хранится в куче.
// Переменная `person1` в стеке хранит лишь указатель (ссылку) на этот объект.
let person1 = Person(name: "Alice")
let person2 = person1 // Копируется ссылка, а не объект. Обе переменные указывают на один объект в куче.
person2.name = "Bob"
print(person1.name) // "Bob" (изменение через одну ссылку видно через другую)