2009-11-10 2 views
3

Objective-C 부분을 C++ 프로젝트에 섞고 있습니다 (크로스 플랫폼에 대해서는 논쟁하지 마십시오).
이제 코코아 환경에서 올바른 스레드 (즉, 메인 스레드)에서 일부 C++ 함수 또는 메소드를 호출하려고합니다.performSelector를 통해 포인터 또는 정수형을 전달하십시오

내 현재 접근법은 objective-c 인스턴스 (NSObject에서 파생)에 함수 포인터를 전달하고 여기에 performSelector/performSelectorOnMainThread을 수행합니다.
그러나 performSelector은 객체를 인수로 기대하기 때문에 일반적으로 어떻게 처리합니까?

예 :

테스트는 다음과 같이 선언
typedef void(*FnPtr)(void*); 
FnPtr fn; 
[someInstance performSelector:@selector(test:) withObject:fn]; 

... :

- (void)test:(FnPtr)fn; 

이 더 나은 방법이 있는지, 그래서 이번 주 목적-C와 난 단지 시작 것을 추가해야 나는 그것에 대해 듣게되어 기쁘다.
프로젝트가 브라우저 플러그인 (현재 Mac에서만 Safari를 대상으로하기 때문에)이므로 주 루프 나 응용 프로그램 개체에 액세스 할 수 없습니다.

+0

중복 : http://stackoverflow.com/questions/1185549/passing-a-native-pointer-toformformlectoronmontthreads-withobject-argument –

답변

5

smorgan here 응답으로, NSValue는 스칼라 C에 대한 컨테이너로 설계되어 & 목표 - C 유형 : 내 솔루션은 올바른/제정신으로 간주되는 경우

- (void)test:(NSValue*)nv 
{ 
    FnPtr fn = [nv pointerValue]; 
    // ... 
} 

// usage: 
NSValue* nv = [NSValue valueWithPointer:fn]; 
[someInstance performSelector:@selector(test:) withObject:nv]; 
0

나는 확실하지 않다 - 나는 그러나 자주 할 단순히 포인터를 (id)로 타입 캐스팅하여 포인터를 전달하십시오. 그것은 더럽지 만 나를 위해 일합니다. 아마도 더 깨끗한 방법은 NSValue를 사용하는 것입니다.

+0

선택기가 실제로 호출되지 않으면 어떻게 될지 모르겠습니다. , 예. 모듈이 언로드 될 때. 'performSelector'의 구현자가 객체를 정리해야한다면 정의되지 않은 동작이 발생하지 않을까요? –

+0

-performSelector : withObject : afterDelay : 다른 일부 매개 변수는 실제로 매개 변수와 대상을 유지하려고 시도합니다. 실제로 비 객체 유형을 전달하고 싶지는 않습니다. – uliwitness

관련 문제