문제

메소드 디스패치 테이블을 설정하고 싶고 Objective-C의 메소드에 대한 포인터를 생성 할 수 있는지 궁금합니다 (C의 기능에 대한 포인터와 같은). 일부 Objective-C 런타임 기능을 사용하여 방법을 동적으로 전환하려고했지만 문제는 모든 인스턴스에 영향을 미칩니다.

객관적인 C를 처음 접했기 때문에 예시 된 예는 높이 평가 될 것입니다.

도움이 되었습니까?

해결책

대상 C 방법이 호출됩니다 selectorS, 그리고 SEL 데이터 형식. 객체가 상속되는 경우 NSObject, 당신은 다음과 같은 선택기 (예 : 메소드 호출)를 수행하도록 지시 할 수 있습니다.

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

이것은 다음과 같은 정의 된 메소드가 있다고 가정합니다.

-(void)doSomething:(MyObject*)arg;

선택기가 할당됩니다 SEL datatypes through the @selector 키워드, 유지하려는 메소드의 이름을 가져옵니다. 이 메소드의 이름은 모든 인수를 제거한 메소드 이름입니다. 예를 들어:

-(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];

선택기 데이터 유형은 스레드와 타이머에 특히 유용하며 스레드를 발송하여 호출하려는 메시지에 선택기를 제공 할 수 있습니다. 선택기 (또는 디스패치 테이블) 배열을 만들어야하거나 여러 매개 변수로 선택기를 호출 해야하는 경우 nsinvocation 클래스를 사용할 수 있습니다. 선택기를위한 래퍼를 제공하고 실제 인수를 지정할 수 있습니다.

Objective-C는 이미 완전히 동적 인 메소드 디스패치 테이블을 기반으로한다는 점을 명심해야합니다. 함수에 대한 참조가 필요한 경우 선택기를 사용하여 기능 포인터를 유지 관리하는 것처럼 들립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top