Spec-Zone.ru › GCC 6

8.10.2 Крючок перенаправления

GNU Objective-C runtime предоставляет крючок, называемый __objc_msg_forward2, который вызывается objc_msg_lookup(), когда он не может найти реализацию метода в таблицах runtime и после того, как попытки вызова +resolveInstanceMethod: и +resolveClassMethod: по динамической регистрации метода не увенчались успехом.

Для настройки крючка необходимо установить глобальную переменную __objc_msg_forward2 в функцию с теми же аргументами и типами возвращаемых значений, что и у objc_msg_lookup(). Когда objc_msg_lookup() не может найти реализацию метода, он вызывает функцию крючка, которую вы предоставили, чтобы получить реализацию метода для возврата. Таким образом, на практике __objc_msg_forward2 позволяет расширить objc_msg_lookup() путем добавления некоторого пользовательского кода, который вызывается для выполнения дополнительного поиска, когда стандартная реализация метода не может быть найдена с помощью обычного поиска.

Этот крючок обычно используется для библиотек «Foundation», таких как GNUstep Base, которые используют его для реализации своего API перенаправления высокоуровневых методов, обычно основанного на методе forwardInvocation:. Поэтому, если вы не реализуете свою собственную библиотеку «Foundation», вам не следует устанавливать этот крючок.

В типичной реализации перенаправления функция крючка __objc_msg_forward2 определяет аргументы и тип возвращаемого значения метода, который ищется, а затем создаёт функцию, принимающую эти аргументы и имеющую этот тип возвращаемого значения, и возвращает её вызывающей стороне. Создание этой функции нетривиально и обычно выполняется с помощью специализированной библиотеки, такой как libffi.

Таким образом, реализация метода перенаправления, созданная objc_msg_lookup(), возвращается и выполняется как обычная реализация метода. Когда вызывается реализация метода перенаправления, обычно ожидается, что все аргументы будут упакованы в некоторый вид объекта (обычно, NSInvocation в библиотеке «Foundation»), и переданы программисту (forwardInvocation:) который затем может манипулировать вызовом метода с помощью API высокого уровня, предоставляемого библиотекой «Foundation». Например, программист может захотеть проверить аргументы, имя вызова метода и потенциально изменить их перед перенаправлением вызова метода одному или нескольким локальным объектам (performInvocation:) или даже удалённым объектам (с помощью распределённых объектов или другого механизма). После завершения всех этих действий значение возврата передаётся обратно и должно быть корректно возвращено исходному вызывающему объекту.

Обратите внимание, что GNU Objective-C runtime в настоящее время не поддерживает перенаправление методов или вызовы методов, кроме крючка __objc_msg_forward2.

Если крючок перенаправления отсутствует или возвращает NULL, runtime в настоящее время пытается выполнить перенаправление с помощью более старого, устаревшего API, и если это не удаётся, он завершает программу. В будущих версиях GNU Objective-C runtime runtime немедленно завершит выполнение.

Предыдущий: Динамическая регистрация методов, Вверх: Общение с GNU Objective-C runtime [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Forwarding-hook.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API