Сообщение Objective C диспетчеризирует механизм

Я использую ножницы символ для «вырезать» на сайте - https://unicode-table.com/

Для копирования я использую два квадрата , но вы также можете использовать - Два последовательных знака равенства или Маджонг Tile Two of Bamboos .

Для вставки я использую - Буфер обмена символов . Эти символы соответствуют символам в слове.

59
задан Dolphin 11 June 2009 в 16:21
поделиться

2 ответа

Как отправляются сообщения Obj-C?

Сообщения Objective-C отправляются с использованием функции среды выполнения objc_msgSend () . Как показано в документации Apple , функция принимает как минимум 2 аргумента:

  1. Принимающий объект
  2. Селектор сообщения
  3. [Переменный список аргументов отправляемого сообщения.]

Экземпляры класса имеют указатель isa , который является указателем на их объект класса. Селекторы методов в каждом объекте хранятся в «таблице» в объекте класса, а функция objc_msgSend () следует за указателем isa на объект класса, чтобы найти это table и проверяет, находится ли метод в таблице для класса. Если он не может его найти, он ищет метод в таблице суперкласса класса. Если не найден, он продолжает движение вверх по дереву объектов, пока не найдет метод или не дойдет до корневого объекта ( NSObject ). На этом этапе создается исключение.

Как кэшируются указатели метода экземпляра и можете ли вы (в общем) определить, прочитав код, будет ли сообщение кэшировано?

Из руководства Apple по времени выполнения Objective-C на Обмен сообщениями :

Чтобы ускорить процесс обмена сообщениями, система времени выполнения кэширует селекторы и адреса методов по мере их использования. Для каждого класса существует отдельный кеш, и он может содержать селекторы для унаследованных методов, а также для методов, определенных в классе. Перед поиском в таблицах рассылки процедура обмена сообщениями сначала проверяет кеш класса получающего объекта (исходя из теории, что метод, который использовался однажды, может быть использован снова). Если селектор метода находится в кэше, обмен сообщениями выполняется лишь немного медленнее, чем вызов функции. Как только программа проработает достаточно долго, чтобы «прогреть» свои кеши, почти все отправляемые им сообщения находят кешированный метод. Кеши растут динамически, чтобы вместить новые сообщения по мере выполнения программы.

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

Являются ли методы класса по существу такими же, как функция C (или метод статического класса в C ++), или есть что-то большее?

Объекты классов обрабатывают отправку методов аналогично тому, как это происходит с экземплярами классов. Каждый объект класса имеет объект, который хранит свои собственные методы класса в объекте, называемом метаклассом . У объекта класса есть собственный isa указатель на его объект метакласса, который, в свою очередь, имеет объекты суперметакласса, от которых он может наследовать объекты класса. Отправка методов в методы класса выглядит так:

  1. Система диспетчеризации следует за указателем isa объекта класса на объект метакласса
  2. В таблице методов объекта метакласса выполняется поиск метода класса.
  3. Если не найден, поиск продолжается до суперкласса объекта метакласса, где поиск продолжается.
  4. Этот процесс повторяется до тех пор, пока либо метод не будет найден, либо пока он не дойдет до корневого метакласса и не возникнет исключение.
91
ответ дан 24 November 2019 в 18:22
поделиться

Я также написал инструкцию по objc_msgSend() на x86_64 в своем веб-блоге, если кто-то хочет углубиться:

http://www.friday.com/bbum/2009/12/18/objc_msgsend-part-1-the-road-map/

19
ответ дан 24 November 2019 в 18:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: