/ / Správny spôsob kombinovania cieľov-c a c ++? - iPhone, C ++, Objective-C, iOS, iOS5

Správny spôsob skombinovania cieľa-c a c ++? - iphone, c ++, objektív-c, ios, ios5

Pracujem na aplikácii, ktorá bude robiť nejaké spracovanie vstupného zvuku v reálnom čase. Našiel som toto myslím, že by som ich mohol použiť ako východiskový bod. Všetky poskytované funkcie sú však v jazyku C ++.

Najjednoduchšia vec, ktorú by som rád začal používať, je zmena textu UILabel na niektoré z hodnôt prijatých funkciou:

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

Všetky funkcie som vložil do @implementácie môjho pohľadu a dokázal som ich skompilovať zmenou prípony na .mm. Vytvoril som vlastnosť UILabel, ale funkcia renderCallback k nej nemôže získať prístup.

Je zrejmé, že samotné vloženie týchto funkcií do implementácie nie je správny spôsob. Ako to urobím správnym spôsobom?

odpovede:

0 pre odpoveď č. 1

Aj keď C ++ môže v zásade ísť do a .mm súbor taký, aký je, to vždy nefunguje (napr. ak ste mali premennú s názvom id bolo by to v rozpore s cieľom C). Väčšinu svojho kódu C ++ môžete striedavo nechať v samostatnom súbore a len #import príslušný C ++ .h súbor do .mm kde vytvoríte a UILabel, atď.

Pokiaľ to, čo a UILabel vyžaduje; musíte vytvoriť NSString* hodnotu. Jednou z možností je niečo ako stringWithFormat:, napr.

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];

Môžete si predstaviť, že z vášho kódu C ++ chytíte akékoľvek primitívne hodnoty, ktoré chcete, a pomocou formátovaného reťazca, ako je uvedené vyššie, ich premeniť na jednu hodnotu štítka.


0 pre odpoveď č. 2

K premennej Objective-C nemôžete priamo pristupovať v metóde C / C ++. Vložte svoj predmet dovnútra 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];
}
//....

}