ChatGPT解决这个技术问题 Extra ChatGPT

Objective-C Runtime: best way to check if class conforms to protocol?

I have a Class (but no instance) and need to know if it conforms to a certain protocol. However, Class can be subclassed several times and class_conformsToProtocol() ignores protocols declared on superclasses.

I could just use class_getSuperclass() and recursively check all the classes in the hierarchy upwards until the superclass is nil. However I wonder if that might be inefficient for deeply nested class hierarchies, and maybe there's a nicer way to do that?

In other words, how is the NSObject method conformsToProtocol best implemented using Objective-C runtime methods so that it finds protocols on superclasses?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

If I'm on the right track with recursively going up the class hierarchy just let me know.


P
Pang

According to the docs,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

should work.


You're right. It was late and no code completion suggestions were made by Xcode. I checked the definition of Class and seeing that it was "typedef struct objc_class *Class" I didn't check the NSObject class reference.
Is there any way to do it on an instance instead of a class? My self.delegate implements multiple protocols and I want to check if it conforms to others than it's class.
@KonradPiascik Just call it on the instance instead: [someObject conformsToProtocol:@protocol(MyProtocol)].
N
Nikita

Or, in case it is a general pointer, like:

Class<MyProtocol> someClassPointer = nil;

you can use:

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

关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now