Сколько куч (heap) может быть в iOS-приложении?

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

Ответ

Строго говоря, в процессе одного приложения может существовать несколько куч (heaps). Однако, при разработке на Swift/Objective-C с использованием ARC, вы обычно взаимодействуете с одной логической «кучей» для объектов.

Детали:

  • Основная куча (Managed Heap): В неё размещаются все экземпляры ссылочных типов (классы), памятью для которых управляет ARC.
  • Дополнительные кучи: Могут создаваться системными библиотеками, низкоуровневыми вызовами (например, malloc с определенными атрибутами) или в многопоточных средах для оптимизации (чтобы избежать блокировок при выделении памяти).
  • Стек vs. Куча:
    class MyClass { } // Экземпляр размещается в куче (heap)
    struct MyStruct { } // Экземпляр размещается в стеке (stack), если не захвачен замыканием

Практический вывод для разработчика:

  1. В повседневной iOS-разработке вы не управляете количеством куч вручную.
  2. Важно понимать разницу между стеком и кучей: объекты в куче требуют управления памятью (ARC) и передаются по ссылке, что влияет на производительность и семантику.
  3. Проблемы с памятью (утечки, высокая фрагментация) относятся к основной куче, за которой следит ARC и инструменты вроде Instruments (Allocations, Leaks).