Objective-C에서 respondsToSelector를 사용하는 경우
- (void)someMethod
{
if ( [delegate respondsToSelector:@selector(operationShouldProceed)] )
{
if ( [delegate operationShouldProceed] )
{
// do something appropriate
}
}
}
문서는 말합니다 :
주의 사항은 공식 프로토콜의 선택적 방법 또는 비공식 프로토콜의 방법에만 필요합니다.
무슨 뜻이에요? 공식 프로토콜을 사용하면 그냥 사용할 수 [delegate myMethod]있습니까?
호출하려는 메서드를 개체가 구현하는지 확인하기 위해 다음과 같이해야한다고 생각할 때 거의 사용합니다. 일반적으로 이것은 선택적 방법이나 비공식 프로토콜이있을 때 수행됩니다.
respondsToSelector대리자 개체와 통신해야하는 코드를 작성할 때만 사용했습니다 .
if ([self.delegate respondsToSelector:@selector(engineDidStartRunning:)]) {
[self.delegate engineDidStartRunning:self];
}
반환 된 객체의 클래스가 무엇인지 확실하지 않은 경우 respondsToSelector반환하는 모든 메서드 및 id또는 제네릭 을 사용하고 싶을 때가 NSObject있습니다.
@kubi가 말한 것에 추가하기 위해, 또 다른 시간은 새로운 버전의 프레임 워크에서 기존 클래스에 메서드가 추가되었지만 여전히 이전 버전과 호환되어야합니다. 예를 들면 :
if ([myObject respondsToSelector:@selector(doAwesomeNewThing)]) {
[myObject doAwesomeNewThing];
} else {
[self doOldWorkaroundHackWithObject:myObject];
}
언급했듯이 kubi respondsToSelector는 일반적으로 프로토콜을 준수하는 메소드의 인스턴스가있을 때 사용됩니다.
// Extend from the NSObject protocol so it is safe to call `respondsToSelector`
@protocol MyProtocol <NSObject>
// @required by default
- (void) requiredMethod;
@optional
- (void)optionalMethod;
@end
이 프로토콜이 주어지면 필요한 모든 메서드를 안전하게 호출 할 수 있습니다.
id <MyProtocol> myObject = ...
[myObject requiredMethod];
그러나 선택적 메서드는 구현되거나 구현되지 않을 수 있으므로 런타임에 확인해야합니다.
if ([myObject respondsToSelector:@selector(optionalMethod)])
{
[myObject optionalMethod];
}
이렇게하면 인식 할 수없는 선택기로 인한 충돌을 방지 할 수 있습니다.
또한 프로토콜을 NSObject의 확장으로 선언해야하는 이유, 즉
@protocol MyProtocol <NSObject>
NSObject 프로토콜이 respondsToSelector:선택자를 선언하기 때문 입니다. 그렇지 않으면 XCode는 호출하는 것이 안전하지 않다고 생각합니다.
Old question, but I have learned to be very cautios with using stuff like addTarget:@selector(fu:) because the method name is not checked nor included in refactoring by XCODE. This has caused me quite some trouble already. So now I made it a habbit to always embed stuff like addTarget or addObserver in a respondsToSelector-Check like so:
if([self respondsToSelector:@selector(buttonClicked:)]){
[self.button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
}else{
DebugLog(@"Warning - a class or delegate did not respond to selector in class %@", self);
}
I know its not super elegant, but i'd rather add some boilerplate code than have an unexpected crash of my apps in the App Store.
참고URL : https://stackoverflow.com/questions/3697058/when-to-use-respondstoselector-in-objective-c
'Nice programing' 카테고리의 다른 글
| StringWriter 또는 StringBuilder (0) | 2020.11.23 |
|---|---|
| 쉼표로 구분 된 목록에 대한 정규식 (0) | 2020.11.23 |
| F #에서 '인라인'사용 (0) | 2020.11.23 |
| CSS에서 : hover 효과를 어떻게 지연시킬 수 있습니까? (0) | 2020.11.23 |
| 글꼴 색상을 변경하는 방법은 무엇입니까? (0) | 2020.11.23 |