Spec-Zone.ru › GCC 15

9.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:) или даже удалённым объектам (с помощью Distributed Objects или другого механизма). После завершения всех этих действий возвращаемое значение передаётся обратно и должно быть корректно возвращено исходному вызывающему коду.

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

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

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

Spec-Zone.ru

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