Когда вызывается alloc
, он (как и любая другая отправка сообщения) сначала преобразуется (компилятором) в одну из функций objc_msgSend *. Эта функция получит указатель на структуру класса в качестве первого аргумента, а @selector(alloc)
- в качестве второго.
Затем objc_msgSend ищет соответствующую реализацию метода +[class alloc]
, которая, как правило, не переопределяется (пользовательская инициализация концептуально выполняется в -initWith ...), так что обычно это будет + [NSObject alloc]. Вполне вероятно, что alloc просто вызывает + [NSObject allocWithZone:]; реализация этой функции может делать следующие шаги:
1) Находит размер класса istance (возможно, через class_getInstanceSize ())
2) Распределяет память, скорее всего, с помощью функции class_createInstance (). Эта функция очищает выделенную память до нуля (поэтому, как говорят спецификации, все ваши ивары при инициализации явно инициализируются равными 0), затем устанавливает указатель isa
вновь созданного объекта на саму структуру класса.
3) allocWithZone: методы возвращают свежий указатель объекта для выделения
4) alloc возвращает указатель объекта отправителю, скорее всего, он встретится с [Class initWith...:]
.
Надеюсь, это поможет. Кроме того, кроме документации по времени выполнения Obj-C, не забудьте проверить реализации GNUstep NSObject. Это логичный и возможный способ, как люди GNU реализовали это и как Apple могла бы это реализовать.