2010-08-01 3 views
0

foo라는 메서드가 있다고 가정 해 보겠습니다.Objective-C 메서드 호출

[self foo]; 

[self performSelector:@selector(foo)]; 

그들에게 동일합니다 사이의 차이점은 무엇입니까? 첫 번째 방법은 훨씬 쉽습니다. 왜 두 번째 방법을 사용하고 싶습니까?

+0

내부 구조에 관심이있는 경우 [objc_msgSend] (http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference)를 참조하십시오. .html # // apple_ref/c/func/objc_msgSend) Objective-C가 내부적으로 메시지 호출을 해결하기 위해 사용하는 함수 – user123444555621

답변

5

:

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]; 
+0

@selector()는 객체 관찰자로 등록하고, NSTimer를 사용하고, 시트 및 경고를 사용하고 지연 후 선택기를 수행 할 때도 사용됩니다. – theMikeSwan

1

음, 어딘가에서 SEL을 얻고 있었고 방금 실행하고 싶다면이 방법을 사용하십시오.

그렇지 않으면 첫 번째 예제를 사용하는 것이 좋습니다. the docs 가입일

+0

선택자가 인수를 취하는 경우 첫 번째 예제를 사용할 수 있습니까? –

+0

@awakeFromNib 물론. –

1

제 개체에 메시지를 전송하고 그래서 상기 제을한다. 거의 모든 경우에 첫 번째 항목을 사용해야합니다. 더 빠르고 명확합니다. 그러나 두 번째 용도는 있습니다. 예를 들어, 콜백을 다시 제공해야하는 상황에서 사용할 수 있습니다.

또 다른 강력한 사용은 NSSelectorFromString()과 함께 사용됩니다. 구성 파일의 문자열이나 사용자 입력을 기반으로 런타임에 사용할 메시지를 문자 그대로 결정할 수 있습니다 (유효성 검사를 잊지 마세요!). NSString -stringWithFormat : 등을 사용하여 선택기 이름을 만들 수도 있습니다. 예를 들어 this parser kit은 구문 분석기 규칙이 일치 할 때이 기술을 사용하여 프로그램에 알립니다.