2012-07-18 2 views
7

performSelector에 대해 약간 혼란 스럽습니다. 나는 이미 인터넷 검색 중이다. 그러나 나에게 명확하지 않다. 누구든지 performSelector의 역할을 설명 할 수 있습니다.iOS에서 performSelector를 사용하는 이유

감사

[self btnClicked]; 

[self performSelector:@selector(btnClicked)]; 


-(void)btnClicked 
{ 

    NSLog(@"Method Called"; 
} 

은 모두 나를 위해 좋은 워킹된다. 이 둘의 차이점은 무엇입니까? [self btnClicked][self performSelector:@selector(btnClicked)];

답변

10

두 가지 방법은 시연했을 때와 동일하지만 후자는 런타임에 호출 할 선택기를 동적으로 결정할 수 있다는 이점이 있습니다.

SEL selector = [self gimmeASelectorToCall]; 
[self performSelector: selector]; 

[Source]

+0

빠른 답변을 주셔서 감사합니다. – QueueOverFlow

1

performSelector은 클래스에서 선언되고 구현 된 메소드를 호출합니다. 이벤트를 코드의 액션을 이벤트에 첨부해야 할 때 사용됩니다.

4

selector 객체를 사용하면 컴파일 타임에 알 수없는 메소드를 호출 할 수 있습니다. 메서드의 이름만을 호출하기 위해서는 문자열로 알 필요가 있습니다.

호출하는 메서드 이름이 컴파일 타임에 알려지면 선택기를 사용하면 비효율적입니다. 명백한 장점이 없으면 코드가 읽기 쉽지 않게됩니다. 라이브러리와 별도로 컴파일 된 다른 코드의 메서드를 호출해야하는 라이브러리를 작성하는 경우 선택기는 두 코드를 분리하는 방법을 제공합니다.

예를 들어 시간 간격이 끝났을 때 다시 전화 할 수있는 타이머 클래스를 작성하는 경우 타이머는 호출해야하는 함수의 이름을 알지 못하므로 다음과 같이 쓸 수 없습니다.

// We do not know if the function is called intervalHasExpired or something else 
[target intervalHasExpired]; 

타이머를 선택자에게 주면 타이머가 다시 전화를 걸 수 있습니다.

[myTimer scheduleWithTarget:self andSelector:@selector(myCompletion)]; 
2

PerformSelector는 기본적으로 런타임 (런타임에 바인딩) 당신이 목표 C 클래스의 메소드의 이름을 알고있는 경우에 일반 C. 같은 언어와 달리, 당신은

를 사용하는 동안 통과하는 어떤 메시지를 결정할 수 있습니다
NSSelectorFromString() 

문자열을 선택기로 변환하고 클래스에서 performSelector를 사용하여 해당 선택기를 호출하게하십시오. 이 방법으로 런타임 중에 다른 함수를 호출하여 호출 할 수 있습니다. 구성 파일을 사용하여 호출 할 함수를 선택할 수도 있습니다.

8

Apple doc은 친구입니다. 그것은

NSObject Protocol Reference

는 수신기에 지정된 메시지를 보내고 메시지의 결과를 반환합니다.특히

:

performSelector:방법은 수신기에 직접 aSelector 메시지를 전송하는 것과 같다.

id myClone = [anObject copy]; 
id myClone = [anObject performSelector:@selector(copy)]; 
id myClone = [anObject performSelector:sel_getUid("copy")]; 

그러나, performSelector : : 방법 당신이 런타임 때까지 결정되지 않는다는 메시지를 보낼 수 있습니다 예를 들어, 다음 메시지 중 세 가지 모두 같은 일을한다.

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

aSelector 인수가 더 인수를 취하지 않는 방법을 확인해야한다 : 변수 선택은 로 인수를 전달할 수 있습니다. 개체가 아닌 다른 것을 반환하는 메서드의 경우 NSInvocation을 사용하십시오.

희망이 있습니다.

+0

감사합니다. 답장. – QueueOverFlow

+0

@stackBlue 여러분을 환영합니다. Apple doc의 주요 부분을 굵게 표시했습니다. 당신이 원한다면 Upvote :-) 건배. –

관련 문제