IT

-performSelector 사용 : 대 메소드 호출

lottoking 2020. 7. 29. 07:33
반응형

-performSelector 사용 : 대 메소드 호출


나는 여전히 Objective-C에 익숙하지 않고 다음 두의 차이점이 무엇인지 궁금합니다.

[object performSelector:@selector(doSomething)]; 

[object doSomething];

기본적으로 사용하면 주어진 선택에서 선택기를 호출 할 수 있습니다. 다시 말해, 선택기는 실행 전에 결정될 필요가 없습니다.

실제로는 동등하지만

[anObject aMethod]; 
[anObject performSelector:@selector(aMethod)]; 

두 번째 양식을 사용하면 다음을 수행 할 수 있습니다.

SEL aSelector = findTheAppropriateSelectorForTheCurrentSituation();
[anObject performSelector: aSelector];

메시지를 보내기 전에


이 기본적인 질문에 대해

[object doSomething];
[object performSelector:@selector(doSomething)]; 

일어날 일에 차이가 없습니다. doSomething은 객체에 의해 동 기적으로 실행됩니다. "doSomething"은 매우 간단한 방법으로, 아무것도 반환하지 않는 변수가 필요하지 않습니다.

다음과 같이 조금 더 복잡한 것입니까?

(void)doSomethingWithMyAge:(NSUInteger)age;

[object doSomethingWithMyAge : 42];

"performSelector"는 "performSelector"라는 변수가있는 변형은 더 이상 호출 할 수 없습니다.

여기서 선택기는 "doSomethingWithMyAge :"이지만 모든 시도는

[object performSelector:@selector(doSomethingWithMyAge:) withObject:42];  

. NSNumber : 42 대신 @ (42)를 전달하면 메소드가 객체 지 아닌 기본 C 유형을 기대하기 때문에 도움이되지 않습니다.

또한 최대 2 개의 매개 변수를 포함하는 performSelector 변형이 없습니다. 메소드는 여러 번 더 많은 매개 변수를 갖습니다.

performSelector의 동기식 변형이 있음을 알았습니다.

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

항상 반환을 반환하고 간단한 BOOL 또는 NSUInteger도 반환 할 수 있습니다.

performSelector의 두 가지 주요입니다. 예를 들어

 SEL method = NSSelectorFromString([NSString stringWithFormat:@"doSomethingWithMy%@:", @"Age");
[object performSelector:method];

다른 용도는 메시지를 객체에 즉식으로 디스패치하는 것인데, 이는 현재 런 루프에서 나중에 실행될 것입니다. 이를 위해 여러 여러 performSelector 변형이 있습니다.

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes;
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
- (void)performSelector:(SEL)aSelector target:(id)target argument:(id)arg order:(NSUInteger)order modes:(NSArray *)modes;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg;

(예, NSThread, NSRunLoop 및 NSObject와 같은 여러 Foundation 클래스 범주에서 수집했습니다)

각 변형에는 고유 한 한 특수 동작이 공통적 인 내용을 공유합니다 (적어도 waitUntilDone이 NO로 경우). "performSelector"호출은 즉시 리턴 오브젝트에 대한 메시지는 시간이 지나면 현재 실행 루프에만입니다.

실행 지연으로 인해 메소드에서 자연스럽게 리턴 값을 사용할 수 있습니다. 반환되는 모든 변형에서-(void) 반환 값이 사용됩니다.

나는 어떻게 그것을 커버하기를 바랍니다 ...


@ennuikiller가 등장했습니다. 기본적으로 동적으로 생성 된 선택기는 코드를 실행할 때 호출 할 메소드의 이름을 알지 못하는 경우에 유용합니다.

한 가지 중요한 차이점은 친구 ( 멀티 멀티하고 지연 변형 포함 )는 0-2 개의 매개 변수가있는 메소드와 함께 사용하도록 설계되어 점에서 다소 제한적이라는 것입니다. 예를 들어, 6 개의 요청 변수로 호출을 반환하는 것입니다.-performSelector:-outlineView:toolTipForCell:rect:tableColumn:item:mouseLocation:NSString


선택기는 다른 언어의 함수 포인터와 약간 비슷합니다. 컴파일 타임에 어떤 메서드를 런타임에 호출할지 모를 때 사용합니다. 또한 함수 포인터와 마찬가지로 호출의 동사 부분 만 캡슐화합니다. 메서드에 매개 변수가있는 경우 매개 변수도 전달해야합니다.

An NSInvocation은 더 많은 정보를 결합한다는 점을 제외하고는 유사한 목적을 수행합니다. 동사 부분을 포함 할뿐만 아니라 대상 개체와 매개 변수도 포함합니다. 이것은 현재가 아니라 미래에 특정 매개 변수를 사용하여 특정 개체에 대한 메서드를 호출하려는 경우에 유용합니다. 적절한 것을 구축하고 NSInvocation나중에 해고 할 수 있습니다 .


둘 사이에는 또 다른 미묘한 차이가 있습니다.

    [object doSomething]; // is executed right away

    [object performSelector:@selector(doSomething)]; // gets executed at the next runloop

다음은 Apple 문서에서 발췌 한 것입니다.

"performSelector : withObject : afterDelay : 다음 실행 루프주기 동안 및 선택적 지연 기간 후에 현재 스레드에서 지정된 선택기를 수행합니다. 선택기를 수행하기 위해 다음 실행 루프주기까지 대기하기 때문에 이러한 메소드는 자동으로 최소 지연을 제공합니다. 현재 실행중인 코드. 대기열에있는 여러 개의 선택기가 대기열에있는 순서대로 차례로 수행됩니다. "

참고 URL : https://stackoverflow.com/questions/1493125/using-performselector-vs-just-calling-the-method

반응형