Ответ
alloc — это классовый метод в Objective-C (+ (instancetype)alloc;), который выделяет (аллоцирует) область памяти для нового экземпляра класса и возвращает «сырой» (неинициализированный) указатель на этот объект.
Важное правило: Вызов alloc всегда должен сопровождаться вызовом метода инициализации, такого как init.
// Классический паттерн: выделение памяти + инициализация
MyClass *myObject = [[MyClass alloc] init];
// Это эквивалентно двум шагам:
MyClass *uninitializedObject = [MyClass alloc]; // 1. Выделение памяти
MyClass *myObject = [uninitializedObject init]; // 2. Инициализация
Что происходит внутри alloc:
- Вычисляется необходимый объём памяти для экземпляра (учитывая переменные экземпляра класса и всех его суперклассов).
- Выделяется этот объём памяти из кучи (heap).
- Устанавливается
isaуказатель на структуру класса объекта. - Счётчик ссылок (retain count) устанавливается в 1 (в среде с ручным управлением памятью, MRC).
- Все переменные экземпляра инициализируются нулевыми значениями (
nilдля объектов,0для примитивов).
Почему init обязателен:
После alloc объект находится в нестабильном состоянии. Метод init выполняет настройку объекта: устанавливает начальные значения переменных, может выделять дополнительные ресурсы. Использование объекта, полученного только через alloc, без init приводит к неопределённому поведению.
В среде ARC вы по-прежнему явно пишете alloc и init, но компилятор автоматически вставляет вызовы retain и release.