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

172

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

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

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

 [myObject conformsToProtocol:@protocol(MyProtocol)];

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

LearnCocos2D
источник

Ответы:

309

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

[MyClass conformsToProtocol:@protocol(MyProtocol)];

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

Wevah
источник
4
Ты прав. Было уже поздно, и Xcode не предлагал никаких дополнений к коду. Я проверил определение класса и увидел, что это «typedef struct objc_class * Class». Я не проверял ссылку на класс NSObject.
LearnCocos2D
Есть ли способ сделать это на экземпляре вместо класса? Мой self.delegateреализует несколько протоколов, и я хочу проверить, соответствует ли он другим, чем его класс.
Конрад Пиаскик
@KonradPiascik Просто позвоните его на экземпляре вместо: [someObject conformsToProtocol:@protocol(MyProtocol)].
августа
3

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

Class<MyProtocol> someClassPointer = nil;

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

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
Никита
источник