Что делает метод alloc в Objective-C?

«Что делает метод alloc в Objective-C?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

alloc — это классовый метод в Objective-C (+ (instancetype)alloc;), который выделяет (аллоцирует) область памяти для нового экземпляра класса и возвращает «сырой» (неинициализированный) указатель на этот объект.

Важное правило: Вызов alloc всегда должен сопровождаться вызовом метода инициализации, такого как init.

// Классический паттерн: выделение памяти + инициализация
MyClass *myObject = [[MyClass alloc] init];

// Это эквивалентно двум шагам:
MyClass *uninitializedObject = [MyClass alloc]; // 1. Выделение памяти
MyClass *myObject = [uninitializedObject init]; // 2. Инициализация

Что происходит внутри alloc:

  1. Вычисляется необходимый объём памяти для экземпляра (учитывая переменные экземпляра класса и всех его суперклассов).
  2. Выделяется этот объём памяти из кучи (heap).
  3. Устанавливается isa указатель на структуру класса объекта.
  4. Счётчик ссылок (retain count) устанавливается в 1 (в среде с ручным управлением памятью, MRC).
  5. Все переменные экземпляра инициализируются нулевыми значениями (nil для объектов, 0 для примитивов).

Почему init обязателен: После alloc объект находится в нестабильном состоянии. Метод init выполняет настройку объекта: устанавливает начальные значения переменных, может выделять дополнительные ресурсы. Использование объекта, полученного только через alloc, без init приводит к неопределённому поведению.

В среде ARC вы по-прежнему явно пишете alloc и init, но компилятор автоматически вставляет вызовы retain и release.