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 runtime в версии GCC 4.6.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/Dynamically-registering-methods.html