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-7.5.0/gcc/Dynamically-registering-methods.html