foo라는 메서드가 있다고 가정 해 보겠습니다.Objective-C 메서드 호출
[self foo];
및
[self performSelector:@selector(foo)];
그들에게 동일합니다 사이의 차이점은 무엇입니까? 첫 번째 방법은 훨씬 쉽습니다. 왜 두 번째 방법을 사용하고 싶습니까?
foo라는 메서드가 있다고 가정 해 보겠습니다.Objective-C 메서드 호출
[self foo];
및
[self performSelector:@selector(foo)];
그들에게 동일합니다 사이의 차이점은 무엇입니까? 첫 번째 방법은 훨씬 쉽습니다. 왜 두 번째 방법을 사용하고 싶습니까?
:
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];
@selector()는 객체 관찰자로 등록하고, NSTimer를 사용하고, 시트 및 경고를 사용하고 지연 후 선택기를 수행 할 때도 사용됩니다. – theMikeSwan
음, 어딘가에서 SEL
을 얻고 있었고 방금 실행하고 싶다면이 방법을 사용하십시오.
그렇지 않으면 첫 번째 예제를 사용하는 것이 좋습니다. the docs 가입일
선택자가 인수를 취하는 경우 첫 번째 예제를 사용할 수 있습니까? –
@awakeFromNib 물론. –
제 개체에 메시지를 전송하고 그래서 상기 제을한다. 거의 모든 경우에 첫 번째 항목을 사용해야합니다. 더 빠르고 명확합니다. 그러나 두 번째 용도는 있습니다. 예를 들어, 콜백을 다시 제공해야하는 상황에서 사용할 수 있습니다.
또 다른 강력한 사용은 NSSelectorFromString()과 함께 사용됩니다. 구성 파일의 문자열이나 사용자 입력을 기반으로 런타임에 사용할 메시지를 문자 그대로 결정할 수 있습니다 (유효성 검사를 잊지 마세요!). NSString -stringWithFormat : 등을 사용하여 선택기 이름을 만들 수도 있습니다. 예를 들어 this parser kit은 구문 분석기 규칙이 일치 할 때이 기술을 사용하여 프로그램에 알립니다.
내부 구조에 관심이있는 경우 [objc_msgSend] (http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference)를 참조하십시오. .html # // apple_ref/c/func/objc_msgSend) Objective-C가 내부적으로 메시지 호출을 해결하기 위해 사용하는 함수 – user123444555621