Spec-Zone.ru › GCC 11

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

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-11.4.0/gcc/Forwarding-hook.html

Spec-Zone.ru

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