선택기


메소드의 내부 표현

Objective-C 컴파일러는 메소드를 식별하는 이름을 컴파일 할 때 내부 표현으로 변환합니다. 이 메소드의 내부 표현을 선택기 라고 메시지의 송수신의 뒤편에서는이 셀렉터가 교환되고 있습니다. 메소드를 특정하기위한 내부 표현에 대해서는 컴파일러에 의존하는 문제이며, 개발자가 알아야 범위에서는 없습니다. 개발자에게 중요한 것은이 선택기를 SEL 형식으로 처리 할 수 있다는 사실입니다.

메소드가 어떤 데이터로 변환되어 어떻게 식별하는지는 문제가 없습니다. 그러나 Objective-C는이 내부 표현을 SEL 형의 변수로서 취급하는 것을 보장하고 있습니다. 즉, SEL 형의 변수는 메소드 이름을 식별하기 위해 컴파일러가 할당 된 특수 코드를 저장할 수 있다는 것입니다.

메소드를 특정하는 선택기는 @selector 컴파일러 지시문을 사용하여 얻을 수 있습니다.

@selector (method)

method는 선택기 싶어 메소드의 이름을 지정합니다. 지정된 메서드의 이름이 존재하는지 여부는 메소드를 호출 할 때 런타임에 결정되기 때문에 컴파일시에는 평가 않을 것입니다.

에서 취득한 선택기 값을 SEL 형의 변수에 저장된으로이를 어떻게 이용할 수 있을까요. 선택이 메소드를 특정하는 성질이있는 이상, 역시 최대의 이용 방법은 함수 포인터처럼 동적으로 메소드를 식별하는 방법입니다. 선택기에서 메소드를 호출하는 기능을 제공하는 것은 루트 클래스입니다.

Object 클래스에는 SEL 형의 값을받는 perform 메소드가 선언되어 있습니다. 이 메소드는 인수로받은 선택기가 특정 메소드를 실행합니다.

- perform : (SEL) aSel;

- perform : (SEL) aSel with : anObject;

- perform : (SEL) aSel with : anObject1 with : anObject2;

aSel에 호출 할 메서드의 선택기를 지정합니다. anObject, anObject1, anObject2는 메소드에 전달할 인수를 지정할 수 있습니다.

#import <stdio.h>
#import <objc / Object.h>

@interface Test : Object
- (void) Write;
@end

@implementation Test
- (void) Write {
	printf ( "I am the bone of my sword \ n");
}
@end

int main () {
	id obj;
	SEL method;

	obj = [Test new];
	method = @selector (Write);
	[obj perform : method];

	return 0;
}

이 프로그램은 Write 메서드를 나타내는 선택기를 SEL 형의 변수 method에 저장합니다. 그리고 Test 클래스의 인스턴스 obj에 perform 메시지를 method를 인수로 보냅니다. perform 메소드는 주어진 선택기에서 실행해야 메소드를 파악하여 실행합니다. 이 성질을 잘 이용하면 런타임에 호출 할 메소드를 상황에 따라 전환 같은 프로그램을 제공 할 수 있습니다.