Что происходит при вызове alloc или allocWithZone? - PullRequest
3 голосов
/ 13 января 2012

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

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

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

Ответы [ 2 ]

4 голосов
/ 03 апреля 2012

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

1 голос
/ 03 апреля 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...