Spec-Zone.ru › GCC 9

8.10.2 Обработка перенаправления

В рамках GNU Objective-C runtime предоставляется обработчик, называемый __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-9.5.0/gcc/Forwarding-hook.html

Spec-Zone.ru

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