8.10.2 Хук перенаправления
Временная реализация GNU Objective-C предоставляет хук, называемый __objc_msg_forward2, который вызывается objc_msg_lookup(), когда не может найти реализацию метода в таблицах времени выполнения и после того, как попытка вызова +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 не поддерживает перенаправление методов или вызовы методов помимо хука __objc_msg_forward2.
Если хук перенаправления отсутствует или возвращает NULL, в настоящее время среда выполнения пытается перенаправить с помощью более старого, устаревшего API, и если это не удаётся, прерывает программу. В будущих версиях временной реализации GNU Objective-C среда выполнения немедленно прервётся.
Предыдущий: Динамическая регистрация методов, Вверх: Передача сообщений с временной реализацией GNU Objective-C [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/Forwarding-hook.html