Objective-C Runtime: найкращий спосіб перевірити, чи відповідає клас протоколу?


171

У мене є клас (але жоден екземпляр) і мені потрібно знати, чи відповідає він певному протоколу. Однак Class можна підкласифікувати декілька разів і class_conformsToProtocol () ігнорує протоколи, оголошені на надкласах.

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

Іншими словами, як NSObject метод відповідностіToProtocol найкраще реалізується за допомогою методів виконання Objective-C, щоб він знаходив протоколи на надкласах?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

Якщо я на правильному шляху з рекурсивним підняттям ієрархії класів, просто дайте мені знати.

Відповіді:


309

Згідно з документами ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

повинен працювати.


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)];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.