2012-01-13 4 views
3

Я хотел знать, как именно создается объект Objective C. Я читал разные сообщения в блогах и документы Apple, но я мог только найти неполную информацию здесь и там о структурах ivar и objc_class, а также различные другие методы и структуры времени выполнения.Что происходит, когда вызывается alloc или allocWithZone?

Но я до сих пор не понял, что происходит, когда мы вызываем alloc на класс и как члены данных суперкласса добавляются в структуру?

Если возможно, может ли кто-нибудь объяснить это мне или указать мне на исходный код этих методов, которые фактически выделяют память?

ответ

4

Когда 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 могла его реализовать.

Смежные вопросы