방법이 있는지 확인


111

Objective-C에 메서드가 있는지 테스트 할 수있는 방법이 있습니까?

호출하기 전에 내 개체에 메서드가 있는지 확인하기 위해 가드를 추가하려고합니다.


Objective-C 클래스가 (를 통해 - forwardInvocation:) 선언하지 않은 선택자에 응답 할 수 있기 때문에 이것이 올바른 접근 방식인지 여부에 대한 질문도 있습니다 .
Donal Fellows

답변:


189
if ([obj respondsToSelector:@selector(methodName:withEtc:)]) {
   [obj methodName:123 withEtc:456];
}

72

정적 메시지 instancesRespondToSelector : (SEL) selector도 있습니다. 다음과 같이 호출합니다.

[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]

또는 다음과 같이 :

[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]

이것은 이것에 따라 하나의 생성자 또는 다른 생성자를 호출하려는 경우 유용 할 수 있습니다 (즉, 인스턴스 자체를 갖기 전에).


1
respondsToSelector와 instancesRespondToSelector의 차이점은 무엇입니까?
CReaTuS

1
주요 차이점은 하나는 인스턴스 메시지 (결정된 인스턴스 메시지가 존재하는지 테스트하기 위해)이고 다른 하나는 클래스 메시지 (결정된 클래스 메시지가 존재하는지 테스트하기 위해)라는 것입니다.
Ricard Pérez del Campo

1
+1 [MyClass instancesRespondToSelector]. init 생성 메서드 내부에 필요했습니다 : self가 아직 생성되지 않았고 respondsToSelector가 항상 NO를 반환하므로 다른 것 (사용되지 않는 메서드) 대신 하나의 super init 메서드를 호출하는 데 서브 클래 싱이 필요할 수 있습니다.
LightMan 2013 년

12

사용 respondsToSelector:. 로부터 문서 :

respondsToSelector :

수신자가 지정된 메시지에 응답 할 수있는 메서드를 구현하거나 상속하는지 여부를 나타내는 부울 값을 반환합니다.

- (BOOL)respondsToSelector:(SEL)aSelector

매개 변수
aSelector- 메시지를 식별하는 선택기.


YES수신자가 aSelector에 응답 할 수있는 메서드를 구현하거나 상속하면 Value를 반환하고 , 그렇지 않으면 반환 값을 반환합니다 NO.


10

respondsToSelector를 찾고 있습니다 : -

if ([foo respondsToSelector: @selector(bar)] {
  [foo bar];
}

으로 DONAL 말한다 위에서 푸 수 있음을 알려줍니다 확실히 바 선택기를 수신 처리합니다. 그러나 foo가 bar 메시지를 수신 할 일부 기본 객체로 bar를 전달하는 프록시 인 경우, responsesToSelector :는 메시지가 bar에 응답하는 객체로 전달 되더라도 NO를 알려줍니다.


1

respondsToSelector로 선택자를 확인하는 것은 일반적으로 델리게이트 메서드에만 해당됩니다. 대리자 메서드에 forwardInvocation 또는 프록시를 사용하면 안됩니다. 다른 상황에서 respondsToSelector를 사용해야하는 경우 프로그램을 디자인하는 더 적절한 방법이 없는지 확인하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.