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