Objective-C Runtime: най-добрият начин да проверите дали класът отговаря на протокола?

Имам клас (но нямам екземпляр) и трябва да знам дали отговаря на определен протокол. Въпреки това, Class може да бъде подкласиран няколко пъти и class_conformsToProtocol() игнорира протоколите, декларирани в суперкласовете.

Мога просто да използвам class_getSuperclass() и рекурсивно да проверя всички класове в йерархията нагоре, докато суперкласът стане нула. Чудя се обаче дали това може да е неефективно за дълбоко вложени йерархии на класове и може би има по-добър начин да направите това?

С други думи, как методът NSObject conformsToProtocol е най-добре реализиран с помощта на методи за изпълнение на 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 не бяха направени предложения за завършване на код. Проверих дефиницията на Class и видях, че е 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