8.3.3 Подписи методов
В этом разделе документируется кодирование типов методов, которое редко требуется для использования Objective-C. Вы можете пропустить его при первом чтении; среда выполнения предоставляет функции, которые будут работать с методами и смогут пройтись по списку параметров и интерпретировать их для вас. Эти функции являются частью публичного «API» и являются предпочтительным способом взаимодействия с подписями методов из кода пользователя.
Но если вам нужно отладить проблему с подписями методов и вам нужно знать, как они реализованы (т.е. «ABI»), продолжайте чтение.
Методы имеют закодированную «подпись», которая доступна среде выполнения. «Подпись» кодирует всю информацию, необходимую для динамического построения вызовов метода во время выполнения: тип возвращаемого значения и аргументы.
«Подпись» — это строка с нулевым завершением, составленная следующим образом:
- Тип возвращаемого значения, включая квалификаторы типа. Например, метод, возвращающий
int, будет иметьiздесь. - Общий размер (в байтах), необходимый для передачи всех параметров. Это включает два скрытых параметра (объект
selfи селектор метода_cmd). - Каждый аргумент с кодированием типа, за которым следует смещение (в байтах) аргумента в списке параметров.
Например, метод без аргументов, возвращающий int , будет иметь подпись i8@0:4 , если размер указателя равен 4. Подпись интерпретируется следующим образом: i — это тип возвращаемого значения (объект int), 8 — это общий размер параметров в байтах (два указателя, каждый размером 4), @0 — это первый параметр (объект со смещением 0 ), а :4 — это второй параметр (объект SEL со смещением 4).
Вы можете легко найти больше примеров, запустив программу «strings» на объектном файле Objective-C, скомпилированном с помощью GCC. Вы увидите множество строк, очень похожих на i8@0:4. Это подписи методов Objective-C.
Предыдущий: @encode, Вверх: Кодирование типов [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/Method-signatures.html