2009-07-05 6 views
7

메서드 디스패치 테이블을 설정하고 Objective-C에서 메서드에 대한 포인터를 만들 수 있는지 궁금합니다 (C의 함수 포인터와 유사). Objective-C 런타임 함수를 사용하여 동적으로 메서드를 전환하려고 시도했지만 문제는 모든 인스턴스에 영향을 미칠 것입니다.Objective-C의 경우 ... 포인터의 메서드

나는 Objective-C에 대해 매우 익숙하지 않기 때문에 그림이있는 예제를 높이 평가할 것입니다.

답변

16

목표 -C 방법은 selector이라고하며, SEL 데이터 유형으로 표시됩니다. 개체가 NSObject에서 상속하는 경우, 따라서 같은 (즉, 메소드를 호출) 선택기를 수행하도록 지시 할 수 있습니다

SEL selector = @selector(doSomething:); 
[obj performSelector:selector withObject:argument]; 

을이 당신이 방법은 같은 정의가 가정

선택기가

-(void)doSomething:(MyObject*)arg; 
있습니다 @selector 키워드를 통해 SEL 데이터 유형에 할당되며 유지하려는 방법의 이름이 적용됩니다. 메소드의 이름은 모든 인수를 제거한 메소드 이름입니다. 예 :

-(void)doSomething:(MyObject*)arg withParams:(MyParams*)params 

@selector(doSomething:withParams:)으로 표시됩니다.

+0

아, 맞아! 제이슨, 정말 고마워! –

5

예! Objective-C에서 함수 포인터는 선택 자라고 불립니다. 당신이 방법은 다음과 같이 정의 된 경우 :

- (void)myFunctionWithObject:(NSObject*)obj otherObject:(NSNumber*)obj2 
{ 
} 

선택기는 다음과 같이 선언한다 :

@selector(myFunctionWithObject:otherObject:) 

객체에 선택기를 수행하려면 사용할 수 있습니다

[object performSelector:@selector(myFunction)]; 

또는

[object performSelector:@selector(myFunctionTakingParameter:) withObject: o]; 

lector 데이터 유형은 스레드를 보내고 호출 할 메시지에 선택기를 제공 할 수있는 스레드 및 타이머에 특히 유용합니다. 선택기 배열 (또는 디스패치 테이블)을 만들거나 여러 매개 변수가있는 선택기를 호출해야하는 경우 NSInvocation 클래스를 사용할 수 있습니다. 선택 자에 대한 랩퍼를 제공하며 실제 인수를 지정할 수 있습니다.

Objective-C는 이미 완전히 동적 인 메서드 디스패치 테이블을 기반으로합니다. 비록 함수에 대한 참조가 필요하다면 셀렉터를 사용하는 함수 포인터를 유지하는 것이 좋습니다.

+0

두 번째 문장을 읽으려면 다음과 같이 변경하십시오.이 경우 METHOD가 정의되어있는 경우. – micmoo

+0

고마워, 벤. 예, 런타임 자체가 완전히 동적 인 패치 테이블이라는 것이 옳습니다. –