Как среда выполнения Objective C создает экземпляр корневого метакласса и других описаний классов? - PullRequest
7 голосов
/ 08 февраля 2010

Я пытаюсь реализовать базовую объектно-ориентированную среду выполнения ANSI C и использую Objective-C в качестве руководства.

Кажется, они состоят из трех частей. Описание класса, интерфейс класса и реализация класса. Для создания экземпляра интерфейса класса знакомый метод использования объекта Class для создания экземпляра своего объекта может произойти, только если среда выполнения уже создала экземпляр вашего объекта класса с использованием описания класса.

Таким образом, все определения классов распределяются статически при первом запуске, чтобы обеспечить возможность создания экземпляров с использованием объекта Class? Или, если они расположены динамически (при первоначальном вызове), как? Является ли это частью цикла выполнения или класс на самом деле является функцией, которая определяет, было ли оно уже выделено или нет до пересылки сообщения?

1 Ответ

5 голосов
/ 08 февраля 2010

Среда выполнения выполняет некоторую инициализацию с помощью функций конструктора, которые вызываются до фактического выполнения программы. Они идут на __attribute__((constructor)) в gcc и clang.

В случае Objective-C некоторые из них встроены в двоичный файл компилятором. Вам придется включить их в заголовки для аналогичного эффекта.

Эти функции используют данные, автоматически внедренные компилятором. Они делают такие вещи, как создание хеш-таблиц для функции поиска классов, которые затем используются для фактической передачи сообщений.

Экземпляры, с другой стороны, распределяются динамически.

Я делаю что-то похожее, так что я не знаю намного лучше, но это так глубоко, как я вырыл.

...