/ / Comment combiner objective-c et c ++? - iphone, c ++, objectif-c, ios, ios5

Manière correcte de combiner objectif-c et c ++? - iphone, c ++, objectif-c, ios, ios5

Je travaille sur une application qui traitera en temps réel l’audio d’entrée. J'ai trouvé ce site que je pense pouvoir utiliser comme point de départ. Cependant, toutes les fonctions fournies sont en C ++.

La chose la plus simple que j'aimerais commencer est de changer le texte d'un UILabel en certaines des valeurs reçues par la fonction:

OSStatus renderCallback(void *userData, AudioUnitRenderActionFlags *actionFlags,
const AudioTimeStamp *audioTimeStamp, UInt32 busNumber,
UInt32 numFrames, AudioBufferList *buffers)

J'ai collé toutes les fonctions dans la @implementation de ma vue et j'ai pu compiler en changeant l'extension en .mm. J'ai créé une propriété UILabel, mais la fonction renderCallback ne peut pas y accéder.

De toute évidence, le simple fait de coller ces fonctions dans @implementation n'est pas la bonne façon de faire cela. Comment puis-je le faire de la bonne façon?

Réponses:

0 pour la réponse № 1

Bien que C ++ puisse fondamentalement entrer dans un .mm tel quel, cela ne fonctionne pas toujours (par exemple, si vous aviez une variable nommée id cela entrerait en conflit avec Objective-C). Vous pouvez alternativement laisser la plupart de votre code C ++ dans un fichier séparé et simplement #import le C ++ approprié .h déposer dans le .mm où vous créez un UILabel, etc.

En ce qui concerne ce qu'un UILabel a besoin; vous devez créer un NSString* valeur. Une possibilité est quelque chose comme stringWithFormat:, par exemple.

int myInt = 0;
const char *myString = "string";
id myObject = @"object";
NSString* myString = [NSString stringWithFormat:@"here is a number: %d, here is a C string: %s, here is an object: %@", myInt, myString, myObject];

Vous pouvez imaginer récupérer toutes les valeurs primitives que vous voulez dans votre code C ++ et les transformer en une valeur d'étiquette unique en utilisant une chaîne formatée comme ci-dessus.


0 pour la réponse № 2

Vous ne pouvez pas accéder directement à la variable objective-c dans la méthode C / C ++. Passez votre objet dans void *userData.

-(void)Method
{
renderCallback(self, &actionFlags,
&audioTimeStamp, busNumber,
numFrames, &buffers);
}

OSStatus renderCallback(void *userData, AudioUnitRenderActionFlags *actionFlags,
const AudioTimeStamp *audioTimeStamp, UInt32 busNumber,
UInt32 numFrames, AudioBufferList *buffers)
{
id obj;
if (userData)
{
obj = (id)userData;
[obj MethodB];
}
//....

}