2010-08-04 7 views
1

J'ai une classe cpp comme ça ..appel méthode objective c de méthode cpp

class MyContactListener : public b2ContactListener 
{ 
    int countContact; 
    ///this is an objective c class... 
    HelloWorld *hel; 


     public: 
    void EndContact(b2Contact* contact) 
    { 
      ///initialize objective c object 
     hel=[[HelloWorld alloc] autorelease]; 
      ///call objective c method......... 
     [hel beginContact]; 

    } 

}; 

dans la classe cpp j'appelle un objectif c method.the méthode objective c ressemble ..

-(void)beginContact 
{ 
    shakeCounter++; 
    [_label setString:[NSString stringWithFormat:@"%d",shakeCounter]]; 


} 

L'objectif c méthode est appelée .... et aussi la variable shakeCounter a augmenté ..... mais _label chaîne n'est pas mise à jour .... label est initialisé correctement et fonctionne correctement si j'ai appelé la méthode objective c de l'objectif c classe en utilisant soi ....

Quelqu'un peut-il aider ???

+1

Veuillez 'NSLog (@"% @ ", _label);' après 'shakeCounter ++;' et afficher la sortie. – kennytm

+1

Cette question est en relation avec [Impossible d'appeler une méthode Objective C à partir d'une fonction C] (http://stackoverflow.com/questions/304885/unable-to-call-an-objective-c-method-from-ac- fonction). – kiamlaluno

+0

oui .... j'ai vu ceci et j'ai obtenu la null .... – Rony

Répondre

0

OWW .... Je l'ai résolu ....

mettre tout cela en haut de projet

#define PTM_RATIO 32 
#import "HelloWorldScene.h" 

id refToSelf; 

et initialiser ce dans onload ou quelque chose comme ça ...

self = [super init]; 
refToSelf = self; 

appelez dès maintenant la méthode objective de c en utilisant cette ....

[refToSelf beginContact]; 

il fonctionnera ...........

+0

En fait, non vous n'avez pas résolu le problème. Le fait que cela semble fonctionner montre simplement que vous faites quelque chose de fondamentalement faux. – JeremyP

+0

Je reçois des avertissements de fuite de mémoire d'exécution avec ARC activé en utilisant le code ci-dessus. http://stackoverflow.com/questions/11840943/runtime-memory-leaked-warnings-when-executing-objective-c-code-within-c-code-wit – docchang

0

Je ne suis pas sûr si elle est la source de votre problème, mais cette ligne:

hel=[[HelloWorld alloc] autorelease]; 

devrait être:

hel=[[[HelloWorld alloc] init] autorelease]; 
0

Votre code est totalement confus. Je suppose que vous voulez créer l'objet Objective-C dans endContact et le conserver jusqu'à un certain point. Au moment où vous créez un nouvel objet à chaque fois, mais vous ne l'initialisez pas du tout. Votre code ne va jamais fonctionner.

La méthode C++ devrait ressembler probablement quelque chose comme:

void EndContact(b2Contact* contact) 
{ 
    // release old object and initialize a new one 
    [hel release]; 
    hel = [[HelloWorld alloc] init]; 
     ///call objective c method......... 
    [hel beginContact]; 

} 

ou

void EndContact(b2Contact* contact) 
{ 
    HelloWorld* hel = [[HelloWorld alloc] init]; 
    [hel beginContact]; 
    [hel release]; 
} 

Selon combien de temps vous voulez que votre objet hel pour durer.

Je ne sais pas pourquoi _label n'est pas mis à jour. Vous aurez besoin de nous montrer votre code pour l'initialiser pour répondre à cela.

0

Peu de choses:

Est-_label un NSString, ou un NSMutableString? Un NSString ne répondra pas à setString, car il est corrigé à la création.

Ce:

 
self = [super init]; 
refToSelf = self; 

est étrange, pour le moins. Vous dites essentiellement self = self ici. Vous n'avez jamais besoin d'appeler init sur votre self.

Je aurait fortement recommande d'avoir un oeil à une excellente introduction d'Apple ici: The Objective C Language

2

Utilisez un délégué à l'auditeur de contact pour appeler les méthodes de la classe objective-c:

class MyContactListener : public b2ContactListener 
{ 
    public: 
    MyDelegateClass *delegate; 

    void BeginContact(b2Contact* contact) { 
     [delegate beginContact:contact]; 
    } 

    void EndContact(b2Contact* contact) { 
     [delegate endContact:contact]; 
    } 

    void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) { 
     [delegate preSolve:contact manifold:oldManifold]; 
    } 

    void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) { 
     [delegate postSolve:contact impulse:impulse]; 
    } 
}; 

Déclarez une Protocole pour le délégué:

#import "Box2D.h" 

@protocol B2ContactListener <NSObject> 

-(void) beginContact:(b2Contact*) contact; 
-(void) endContact:(b2Contact*) contact; 
-(void) preSolve:(b2Contact*) contact manifold:(const b2Manifold*) oldManifold; 
-(void) postSolve:(b2Contact*) contact impulse:(const b2ContactImpulse*) impulse; 

@end 

Déclarez l'interface qui implémente le protocole:

@interface MyDelegateClass: CCLayer <B2ContactListener> { 
    //interface code here. 
} 
@end 

@implementation MyDelegateClass 

-(void) beginContact:(b2Contact*) contact { 
    //implement your code here 
} 
-(void) endContact:(b2Contact*) contact { 
    //implement your code here 
} 
-(void) preSolve:(b2Contact*) contact manifold:(const b2Manifold*) oldManifold{ 
    //implement your code here 
} 
-(void) postSolve:(b2Contact*) contact impulse:(const b2ContactImpulse*) impulse{ 
    //implement your code here 
} 
@end 

Construisez le délégué et attribuez-le dans votre code. Réglez-le dans votre objet world:

MyContactListener *listener = new MyContactListener(); 
listener->delegate = self; 
world_->SetContactListener(listener); 

Maintenant, votre classe d'objectif-c recevra les événements.