Spec-Zone.ru › GCC 14

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 runtime в настоящее время не поддерживает перенаправление методов или вызовы методов, кроме крючка __objc_msg_forward2.

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

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

Spec-Zone.ru

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