Spec-Zone.ru › GCC 8

8.10.1 Динамическая регистрация методов

Если objc_msg_lookup() не находит подходящей реализации метода, потому что получатель не реализует необходимый метод, он пытается определить, может ли класс динамически зарегистрировать метод.

Для этого среда выполнения проверяет, реализует ли класс получателя метод

+ (BOOL) resolveInstanceMethod: (SEL)selector;

в случае метода экземпляра или

+ (BOOL) resolveClassMethod: (SEL)selector;

в случае метода класса. Если класс его реализует, среда выполнения вызывает его, передавая в качестве аргумента селектор оригинального метода, и если он возвращает YES, среда выполнения пытается выполнить поиск снова, что может привести к успеху, если соответствующий метод был динамически добавлен +resolveInstanceMethod: или +resolveClassMethod:.

Это позволяет классам динамически регистрировать методы (добавляя их в класс с помощью class_addMethod) при их первом вызове. Для этого класс должен реализовать +resolveInstanceMethod: (или, в зависимости от случая, +resolveClassMethod:) и распознавать селекторы методов, которые могут быть зарегистрированы динамически во время выполнения, регистрировать их и возвращать YES. Он должен возвращать NO для методов, которые не были динамически зарегистрированы во время выполнения.

Если +resolveInstanceMethod: (или +resolveClassMethod:) не реализовано или возвращает NO, среда выполнения пытается использовать механизм переадресации.

Поддержка +resolveInstanceMethod: и resolveClassMethod: была добавлена в среду выполнения GNU Objective-C в GCC версии 4.6.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Dynamically-registering-methods.html

Spec-Zone.ru

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