2010-06-12 1 views
0

spacemanager를 사용하여 각 단계가 끝난 후 선택 바디에서 액션을 수행해야하므로 iterateFunc에 대한 자체 C 함수를 정의하는 것이 최선의 방법이라고 생각했습니다.iterateFunc를 사용하여 objective c 메서드 호출

같은 클래스에서 obj 메소드를 호출하는 방법을 모르겠다는 것을 제외하면 모든 것이 잘 작동합니다. 즉, obj 클래스에는 iterateFunc를 대체하는 c 함수와 호출해야하는 메소드가 모두 들어 있습니다. 어떻게 C 함수에 'self'가 무엇인지 알려주지 않아서 메서드를 호출 할 수 있습니다. 내가 알 수있는 한, 새로운 iterateFunc에 추가 정보를 전달할 방법이 없습니다.

어떤 아이디어가 더 좋습니까?

업데이트 : 응답

감사합니다. 새로운 spacemanager 선언, 하나는 iterateFunc을 다시 정의 할 수 있습니다 :

smgr = [[SpaceManager alloc] init]; 
smgr.iterateFunc=doThisFunc; 

을 같은 클래스에서, "doThisFunc"기능을 선언 할 수 있습니다. spacemanager에서

iterateFunc은 "단계"메서드에서 호출됩니다

-(void) step: (cpFloat) delta 
{ 
..... 
    cpSpaceHashEach(_space->activeShapes, _iterateFunc, self); 
.... 
} 

그래서 내 첫번째 생각은 spacemanager을 하위 클래스, 그리고 내 사용자 지정 단계 방법에서, 내 자신의 클래스와 cpSpaceHashEach를 호출하는 대신 자기 (spacemanager, 즉). 거기에 중간 단계로, 나는 그것을 할 필요조차하지 않았다는 것을 깨달았습니다. 내 단계 방법을 서브 클래스 화하고 정의하는 것이 내가해야 할 전부 였기 때문에. 저의 새로운 단계 방법 :

-(void) step: (cpFloat) delta 
{  
    [super step:delta]; 
    //Having of course set the "myObject" variable elsewhere as my other object 
    [myObject doThis]; 
} 

감사합니다. 답장을 보내 주시고 장래에 더 나은 질문을하도록 도와주십시오.

답변

1

신성 모호성, 배트맨, 코드 스 니펫은 어디에 있습니까? 고맙게도 Google의 Magic Powers가 그날을 구합니다.

iterateFunc의 선언은 무엇인가 :

이 질문은 세부의 몇 비트를 필요에 응답하려면?

오. 그것은 cpSpaceHashIterator입니다. 도움이되지 않습니다.

아 ... 거기이다 : 그것은 void *data 인수처럼 보이는

typedef void (*cpSpaceHashIterator)(void *obj, void *data);

가 당신의 대답이다. 특히 iterator 함수에 투명하게 전달되는 것처럼 보입니다. 이처럼

cpSpaceEachBody(cpSpace *space, cpSpaceBodyIterator func, void *data) 

:

cpSpaceEachBody(space, funcPtr, (void *)self); 

그런 다음 반복자 FUNC이 할 수있는 : 당신이 호출하는 경우 즉, 입력

void iteratorFunc(void *obj, void *data) { 
    [(MyClass *)data iterateThis: obj]; 
} 
+0

감사합니다, 당신 말이 맞아, 내 원본은 코드에서 나 빠졌다. 내 Xcode에 액세스하지 않고 iPad에서 게시 한 것이므로 나중에 코드를 추가 할 필요가 없습니다. 나를 도와 주려고하는 사람들에게 도움이되지 않습니다. 미안합니다. 코드를 추가하려면 Spacemanager의 iteratorFunc를 다시 할당하는 방법은 간단한 속성 할당을 사용한다는 점만 제외하면 내가 언급 한 것을 정확히 생각하고있었습니다. smgr.iteratorFunc = doThisFunction; 아무 것도 지정하지 않아도됩니다. 물론 하위 클래스가 될 수도 있지만, 제가 누락 된 깨끗한 방법이 있는지 궁금합니다. –

+0

더 많은 코드가 필요합니다. 내가 발견 한 유일한 우주인은 순수한 C이며, 전체적으로'무효 * '를 유지하고 있습니다. 당신이'smgr.iteratorFunc = doThisFunction'을 말할 때, 문맥은 무엇이며 어떻게 그 행동이 나중에 촉발 될까요? – bbum