Objective-C Runtime : 클래스가 프로토콜을 준수하는지 확인하는 가장 좋은 방법은 무엇입니까?


171

클래스가 있지만 인스턴스가 없으며 특정 프로토콜을 준수하는지 알아야합니다. 그러나 클래스는 여러 번 서브 클래 싱 될 수 있으며 class_conformsToProtocol ()은 수퍼 클래스에 선언 된 프로토콜을 무시합니다.

class_getSuperclass ()를 사용하고 수퍼 클래스가 0이 될 때까지 계층 구조의 모든 클래스를 재귀 적으로 확인할 수 있습니다. 그러나 깊게 중첩 된 클래스 계층에 비효율적 일지 궁금해하며 더 좋은 방법이 있습니까?

다시 말해서 NSObject 메소드는 Objective-C 런타임 메소드를 사용하여 슈퍼 클래스에서 프로토콜을 찾을 수 있도록 ToProtocol을 어떻게 최상으로 구현합니까?

 [myObject conformsToProtocol:@protocol(MyProtocol)];

재귀 적으로 클래스 계층 구조를 올라 가면서 올바른 길을 가고 있다면 알려주세요.

답변:


309

워드 프로세서에 따르면 ,

[MyClass conformsToProtocol:@protocol(MyProtocol)];

작동해야합니다.


4
네가 옳아. 늦었고 Xcode에서 코드 완성 제안을하지 않았습니다. Class의 정의를 확인하고 "typedef struct objc_class * Class"인 것을 확인했습니다. NSObject 클래스 참조를 확인하지 않았습니다.
LearnCocos2D

클래스 대신 인스턴스에서 수행 할 수있는 방법이 있습니까? 내 self.delegate여러 프로토콜을 구현하고 클래스 이외의 다른 프로토콜과 일치하는지 확인하고 싶습니다.
Konrad Piascik

@KonradPiascik 대신 인스턴스에서 호출하십시오 [someObject conformsToProtocol:@protocol(MyProtocol)].
Wevah

3

또는 다음과 같은 일반적인 포인터 인 경우 :

Class<MyProtocol> someClassPointer = nil;

당신이 사용할 수있는:

[someClassPointer.class conformsToProtocol:@protocol(MyProtocol)];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.