Типичная реализация сообщения Цель C - PullRequest
3 голосов
/ 26 мая 2011

Мне интересно, как выглядит типичная (или, по крайней мере, Apple) реализация системы динамического обмена сообщениями Objective C. Как селекторы обрабатываются во время компиляции и выполнения, на что действительно указывает NSObject*, как там реализована реализация метода.

В C ++ у нас есть виртуальные функции; то, как они реализованы, является официальной деталью реализации, но в действительности указатель таблицы VF в качестве первого элемента данных является в значительной степени заданным. Мне интересно, есть ли такой же повсеместный способ реализации системы классов ObjC.

Ответы [ 3 ]

3 голосов
/ 26 мая 2011

Это может быть довольно долго. Ответ ughoavgfhw - хорошее начало.

Я бы рекомендовал прочитать следующие сообщения в блоге:

И если вы не боитесь углубляться в исходный код, objc и clang доступны на веб-сайте Apple с открытым исходным кодом .

3 голосов
/ 26 мая 2011

Проверьте заголовки в /usr/include/objc на вашем ближайшем Mac разработки для некоторых деталей низкоуровневых объектов. (Apple изменила некоторые вещи в новой среде выполнения, но многие изменения не были опубликованы. Подробную информацию об исходной реализации можно найти в этих заголовках или путем поиска в «target c runtime».) Некоторые основные моменты: Объект является просто структура, содержащая переменные экземпляра. Первый элемент в этой структуре называется isa и представляет собой просто указатель на объект класса (или суперкласс для объекта класса). Объект класса содержит данные, указывающие имя и расположение различных методов и переменных в классе, и среда выполнения ссылается на эти структуры данных при поиске метода. Как только метод был найден в первый раз, он сохраняется в таблице для быстрого использования в будущем.

1 голос
/ 26 мая 2011

Официальный справочник Apple Objective-C Runtime документирует библиотеку C, которая обеспечивает все диспетчеризацию Objective-C, рефлексию и другие объектно-ориентированные задачи.Большинство используемых реальных структур данных непрозрачны - я думаю, что все они начиная с 10.5 - и нет никаких оснований предполагать, что непрерывная строка в реализации возвращается к 1986.

Компилятор просто конвертирует ваши вещи Objective-C ввызовы во время выполнения;вы также можете вызывать его самостоятельно, чтобы получить такие вещи, как указатели на функции C на ваши методы, которые затем можно отправлять без обычных накладных расходов, хотя за счет целого ряда других механизмов они больше не работают.

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