Objective-C Runtime: лучший способ проверить, соответствует ли класс протоколу?


У меня есть класс (но нет экземпляра) и нужно знать, соответствует ли он определенному протоколу. Однако класс может быть подклассом несколько раз, и class_conformsToProtocol() игнорирует протоколы, объявленные на суперклассах.

Я мог бы просто использовать class_getSuperclass () и рекурсивно проверять все классы в иерархии вверх, пока суперкласс не будет равен нулю. Однако мне интересно, может ли это быть неэффективным для глубоко вложенных иерархий классов, и, возможно, есть более хороший способ сделать это?

другими словами, как метод NSObject conformsToProtocol лучше всего реализован с использованием методов времени выполнения Objective-C, чтобы он находил протоколы на суперклассах?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

Если я на правильном пути с рекурсивно идти вверх по иерархии классов, просто дайте мне знать.

2 164

2 ответа:

согласно документам,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

должны работать.

или, в случае, если это общий указатель, например:

Class<MyProtocol> someClassPointer = nil;

вы можете использовать:

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];