메서드 디스패치 테이블을 설정하고 Objective-C에서 메서드에 대한 포인터를 만들 수 있는지 궁금합니다 (C의 함수 포인터와 유사). Objective-C 런타임 함수를 사용하여 동적으로 메서드를 전환하려고 시도했지만 문제는 모든 인스턴스에 영향을 미칠 것입니다.Objective-C의 경우 ... 포인터의 메서드
나는 Objective-C에 대해 매우 익숙하지 않기 때문에 그림이있는 예제를 높이 평가할 것입니다.
메서드 디스패치 테이블을 설정하고 Objective-C에서 메서드에 대한 포인터를 만들 수 있는지 궁금합니다 (C의 함수 포인터와 유사). Objective-C 런타임 함수를 사용하여 동적으로 메서드를 전환하려고 시도했지만 문제는 모든 인스턴스에 영향을 미칠 것입니다.Objective-C의 경우 ... 포인터의 메서드
나는 Objective-C에 대해 매우 익숙하지 않기 때문에 그림이있는 예제를 높이 평가할 것입니다.
목표 -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:)
으로 표시됩니다.
예! 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는 이미 완전히 동적 인 메서드 디스패치 테이블을 기반으로합니다. 비록 함수에 대한 참조가 필요하다면 셀렉터를 사용하는 함수 포인터를 유지하는 것이 좋습니다.
두 번째 문장을 읽으려면 다음과 같이 변경하십시오.이 경우 METHOD가 정의되어있는 경우. – micmoo
고마워, 벤. 예, 런타임 자체가 완전히 동적 인 패치 테이블이라는 것이 옳습니다. –
아, 맞아! 제이슨, 정말 고마워! –