Nice programing

Objective-C에서 respondsToSelector를 사용하는 경우

nicepro 2020. 11. 23. 19:58
반응형

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

반응형