Spec-Zone.ru › GCC 4

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 будет немедленно прерывать выполнение.

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

Spec-Zone.ru

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