Динамическая типизация, Objective-C, как это работает? - PullRequest
11 голосов
/ 05 апреля 2011

Меня интересует, как работает динамическая типизация в Objective-C.Я изучал тип «id», я знаю, что он делает и как его использовать, но мне любопытно ... Как такая функциональность реализуется под капотом?разрешить что-либо во время компиляции, только во время выполнения.Я предполагаю, что он может просто указывать на первый байт некоторого объекта в памяти, но как хранится сигнатура класса?Откуда он знает, на что он в данный момент указывает и как он реализует различные методы получения для класса указанного объекта?

Ответы [ 2 ]

15 голосов
/ 05 апреля 2011

«Под капотом», так сказать, все объекты Objective-C являются структурами C с указателем на объект Class, который представляет их тип. id - это указатель на самую базовую такую ​​структуру, которая выглядит примерно так:

struct objc_object {
    Class isa;
}

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

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

7 голосов
/ 05 апреля 2011

Чтобы добавить к ответу Аномии, как класс хранит таблицу, на какие сообщения он отвечает и какие биты кода эти сообщения вызывают, совершенно непрозрачно. Так что есть степень, в которой никто не может точно ответить, как работает реализация Apple, и она почти наверняка будет отличаться от реализации GNU.

Тем не менее, справочник по времени выполнения Apple *1003* от Apple объясняет все, что может выполнять среда выполнения, на уровне C. Таким образом, вы можете увидеть, какие операции возможны для настройки и поиска вещей. Это относительно простая система под капотом, в первую очередь просто набор словарей (в неизменном смысле), которые отображают одну вещь на другую, например, от селектора к указателю функции IMP. Если в таблице есть запись для определенного класса, то вызывается соответствующая вещь. Если нет, то проверяются суперклассы, рассматривается стандартный forwardingTargetForSelector: механизм отката и т. Д.

Помимо этого, более конкретные комментарии требуют более конкретных вопросов. Есть много деталей, например, что наблюдение значения ключа достигается методом swizzle (поэтому среда выполнения настраивает указатель C, который класс будет вызывать для установщика, на тот, который вызывает реальный установщик и информирует того, кто наблюдает), но все они являются только определенным использованием среды выполнения, как задокументировано.

...