2009-11-10 2 views
3

Je suis en train de mixer des parties Objective-C dans un projet C++ (ne discutez pas à ce sujet, sa multiplateforme).
Je veux maintenant appeler certaines fonctions ou méthodes C++ sur le thread correct (c'est-à-dire le thread principal) dans un environnement de cacao.passer des pointeurs ou des types entiers via performSelector

Mon approche actuelle passe des pointeurs de fonction à une instance d'objectif-c (dérivée de NSObject) et fait performSelector/performSelectorOnMainThread sur elle.
Mais les performSelector s s'attendent à ce que les objets soient leurs arguments, alors comment l'envelopperiez-vous habituellement?

Exemple:

typedef void(*FnPtr)(void*); 
FnPtr fn; 
[someInstance performSelector:@selector(test:) withObject:fn]; 

... où test est déclaré:

- (void)test:(FnPtr)fn; 

dois ajouter que je ne ai commencé avec c-objectif cette semaine, donc s'il y a une meilleure façon Je serais aussi heureux d'en entendre parler.
Notez également que je n'ai aucun accès à la boucle principale ou aux objets de l'application, car le projet est un plug-in de navigateur (qui ne cible actuellement que Safari sur le mac).

+0

dupliquer: http://stackoverflow.com/questions/1185549/passing-a-native-pointer-to-performselectoronmainthreads-withobject-argument –

Répondre

5

Comme répondu par smorgan here, NSValue est conçu comme un conteneur pour scalaire C & types Objective-C:

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

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

Je ne sais pas si ma solution est considérée comme saine d'esprit/correct - Je cependant souvent passer les pointeurs en les typant simplement en (id) s. C'est sale mais ça marche pour moi. Le moyen le plus propre serait d'utiliser NSValue.

+0

Je ne sais pas ce qui est supposé arriver si le sélecteur n'est pas réellement appelé , par exemple lorsque son module est déchargé. Si l'implémenteur de 'performSelector' est censé nettoyer l'objet, cela ne se traduirait-il pas par un comportement indéfini? –

+0

-performSelector: withObject: afterDelay: et quelques autres tentent de conserver le paramètre et la cible. Vous ne voulez vraiment pas passer un type de non-objet là. – uliwitness

Questions connexes