Ответ
В куче (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" (изменение через одну ссылку видно через другую)