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

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

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

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

 [myObject conformsToProtocol:@protocol(MyProtocol)];

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


person LearnCocos2D    schedule 08.08.2010    source источник


Ответы (2)


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

[MyClass conformsToProtocol:@protocol(MyProtocol)];

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

person Wevah    schedule 08.08.2010
comment
Ты прав. Было поздно, и Xcode не сделал никаких предложений по завершению кода. Я проверил определение класса и увидел, что это typedef struct objc_class * Class. Я не проверял ссылку на класс NSObject. - person LearnCocos2D; 09.08.2010
comment
Есть ли способ сделать это на экземпляре вместо класса? Мой self.delegate реализует несколько протоколов, и я хочу проверить, соответствует ли он другим, кроме своего класса. - person Konrad Piascik; 17.09.2018
comment
@KonradPiascik Вместо этого назовите его на экземпляре: [someObject conformsToProtocol:@protocol(MyProtocol)]. - person Wevah; 18.09.2018

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

Class<MyProtocol> someClassPointer = nil;

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

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
person Nikita    schedule 11.05.2017