Usa C ++ con Cocoa invece di Objective-C?

Mi piacerebbe scrivere applicazioni che usano C ++ e il framework Cocoa perché Apple non sta rendendo Carbon 64-bit capace. C ++ sembra essere piuttosto vaniglia nella sua implementazione su Linux e Windows, ma su Mac OS X sembra che siano necessari ulteriori pezzi specifici di codice di Apple (come un wrapper Obj-C). Sembra anche che Apple stia costringendo gli sviluppatori a scrivere in Objective-C piuttosto che in C ++, anche se potrei sbagliarmi.

Sto cercando di trovare un percorso per scrivere codice sul Mac che sia facile da mantenere su più piattaforms. Scrivere codice in C ++ per Linux / Windows e quindi riscrivere grandi porzioni in Objective-C sarebbe molto inefficiente.

C’è un modo per scrivere codice in C ++ che sarà supportato per il futuro e supportato in Xcode? Inoltre, se questo è ansible, come mischiare C ++ e Objective-C in Xcode? Grazie.

Non è ansible scrivere un’applicazione Cocoa interamente in C ++. Cocoa fa molto affidamento sulle capacità di associazione tardive di Objective-C per molte delle sue tecnologie di base, come i legami chiave-valore, i delegati (stile Cocoa) e il modello di azione target. I requisiti di binding tardivo rendono molto difficile l’implementazione dell’API Cocoa in un linguaggio digitato in fase di compilazione, come C ++ ⁱ. Ovviamente puoi scrivere una pura app C ++ che gira su OS X. Non è ansible utilizzare le API Cocoa.

Quindi, hai due opzioni se vuoi condividere il codice tra le app C ++ su altre piattaforms e la tua applicazione basata su Cocoa. Il primo è scrivere il livello del modello in C ++ e la GUI in Cocoa. Questo è un approccio comune utilizzato da alcune app molto grandi, tra cui Mathematica . Il tuo codice C ++ può essere lasciato invariato (non hai bisogno di estensioni “funky” per scrivere o compilare C ++ su OS X). Il tuo livello controller probabilmente utilizzerà Objective-C ++ (forse l’estensione Apple “funky” a cui ti riferisci). Objective-C ++ è un superset di C ++, proprio come Objective-C è un superset di C. In Objective-C ++, puoi fare chiamate di messaggi in stile objc (come [some-objc-object callMethod]; ) da un C ++ funzione. Al contrario, puoi chiamare le funzioni C ++ dal codice ObjC come:

 @interface MyClass { MyCPPClass *cppInstance; } @end @implementation MyClass - (id)init { if(self = [super init]) { cppInstance = new MyCPPClass(); } return self; } - (void) dealloc { if(cppInstance != NULL) delete cppInstance; [super dealloc]; } - (void)callCpp { cppInstance->SomeMethod(); } @end 

Puoi trovare ulteriori informazioni su Objective-C ++ nella guida del linguaggio Objective-C. Il livello vista può quindi essere puro Objective-C.

La seconda opzione è utilizzare un toolkit C ++ multipiattaforma. Il kit di strumenti Qt potrebbe adattarsi al progetto. I toolkit multipiattaforma sono generalmente disprezzati dagli utenti Mac perché non ottengono tutti i dettagli in modo esatto e gli utenti Mac si aspettano di essere lucidati nell’interfaccia utente delle applicazioni Mac. Tuttavia, è un lavoro sorprendentemente buono e, a seconda del pubblico e dell’uso della tua app, potrebbe essere abbastanza buono. Inoltre, perderai alcune delle tecnologie specifiche di OS X come Core Animation e alcune funzionalità di QuickTime, anche se ci sono sostituzioni approssimative nell’API Qt. Come hai sottolineato, Carbon non verrà portato a 64-bit. Poiché Qt è implementato su Carbon API, Trolltech / Nokia hanno dovuto trasferire Qt all’API Cocoa per renderlo compatibile a 64 bit. La mia comprensione è che il prossimo rilascio di Qt (attualmente in release candiate ) completa questa transizione ed è compatibile con 64-bit su OS X. Puoi dare un’occhiata all’origine di Qt 4.5 se sei interessato ad integrare C ++ e le API Cocoa.


ⁱ Per un po ‘Apple ha reso disponibile l’API Cocoa a Java, ma il bridge ha richiesto un’accurata regolazione manuale e non è stato in grado di gestire le tecnologie più avanzate come i Key-Value Bindings descritti in precedenza. Attualmente i linguaggi runtime-bound, come Python, Ruby, ecc. Sono l’unica vera opzione per scrivere un’app Cocoa senza Objective-C (sebbene ovviamente questi bridge utilizzino Objective-C sotto il cofano).

Beh, può sembrare sciocco, ma in realtà possiamo scrivere codice C ++ puro per creare GUI per Mac OS X, ma dobbiamo collegarci al framework Cocoa.

 /* * test1.cpp * This program shows how to access Cocoa GUI from pure C/C++ * and build a truly functional GUI application (although very simple). * * Compile using: * g++ -framework Cocoa -o test1 test1.cpp * * that will output 'test1' binary. */ #include  #include  #include  #include  extern "C" int NSRunAlertPanel(CFStringRef strTitle, CFStringRef strMsg, CFStringRef strButton1, CFStringRef strButton2, CFStringRef strButton3, ...); int main(int argc, char** argv) { id app = NULL; id pool = (id)objc_getClass("NSAutoreleasePool"); if (!pool) { std::cerr < < "Unable to get NSAutoreleasePool!\nAborting\n"; return -1; } pool = objc_msgSend(pool, sel_registerName("alloc")); if (!pool) { std::cerr << "Unable to create NSAutoreleasePool...\nAborting...\n"; return -1; } pool = objc_msgSend(pool, sel_registerName("init")); app = objc_msgSend((id)objc_getClass("NSApplication"), sel_registerName("sharedApplication")); NSRunAlertPanel(CFSTR("Testing"), CFSTR("This is a simple test to display NSAlertPanel."), CFSTR("OK"), NULL, NULL); objc_msgSend(pool, sel_registerName("release")); return 0; } 

Sì, puoi semplicemente usare C ++ (cioè scriverlo nei file * .cpp) e persino mescolare C ++ e Objective-C all’interno dei file * .mm (il codice standard Objective-C è memorizzato nei file * .m).

Naturalmente, devi ancora utilizzare Objective-C per l’interfaccia utente e creare wrapper Objective-C per gli oggetti C ++. Un’altra opzione è quella di passare a Qt che è un framework C ++ che supporta Windows, Mac OS X e Linux – e sarà rilasciato sotto LGPL con la prossima versione 4.5.

Sì, puoi mescolarli.

È necessario utilizzare Objective-C per operare direttamente sugli oggetti della GUI e ricevere notifiche da essi.

Questi oggetti Objective-C possono chiamare direttamente la logica C ++ se li si inserisce in file .mm, invece dei puri file Objective-C .m. Nota che potresti vedere (molto) un consiglio più vecchio suggerendo di usare un MA maiuscole per indicare Objective-C ++, ma questo è molto discontinuo e probabilmente confonderà te e il compilatore.

Non è necessario avvolgere ogni singolo object C ++ ma il codice Objective-C dovrà contenere dei puntatori.

Apple non pubblica più alcun esempio che mostri come farlo.

C’è un bellissimo video di Peter Steinberger ospitato su Realm [Objective] C ++: Cosa potrebbe eventualmente andare storto? Consiglio vivamente a chiunque stia ancora utilizzando Objective-C ++ e si può rapidamente sfogliare la trascrizione.

Se stai solo cercando di usare il semplice C ++ di vaniglia, questo è assolutamente supportato e non è diverso da qualsiasi altra piattaforma. Xcode ha persino un modello per esso in File> Nuovo progetto> Utilità riga di comando> Strumento C ++. Inoltre, un certo numero di popolari librerie open-source (libcurl, libxml2, sqlite, ecc.) Sono dotate di OS X e sono disponibili per il collegamento dinamico. Non devi usare Cocoa o qualcosa di specifico di Apple se non vuoi.

Se vuoi utilizzare Cocoa in alcune parti della tua app, dai un’occhiata a Objective-C ++ . Puoi mescolare C ++ e Objective-C nello stesso file dandogli un’estensione di .mm, oppure facendo clic con il pulsante destro del mouse sul file in Xcode e selezionando Ottieni informazioni> Generale, quindi modificando il Tipo di file in sourcecode.cpp.objcpp. La seconda opzione è utile se si ha un file .cpp in cui si desidera utilizzare Objective-C all’interno di un #ifdef specifico per Mac.

Anche se questa è una domanda vecchia di anni …

Ho provato a creare wrapper C ++ di alcune classi di Cocoa .

E ‘stata una bella esperienza. C ++ ha fornito una sicurezza di tipo migliore rispetto a Objective-C, e mi ha fatto scrivere meno codice. Ma il tempo di compilazione e la sicurezza della memoria sono peggiori. È ansible, ma alcune funzioni basate sulla dynamic non sono facili da gestire. Penso che non abbia senso occuparsene in C ++.

Ad ogni modo il mio progetto è stato finalmente abbandonato a causa dell’annuncio di Swift. Ha chiarito tutti i motivi per cui volevo usare C ++ all’inizio e fornisce ancora di più e meglio.

Se stai scrivendo un’applicazione puramente grafica, ovvero stai disegnando tutto usando il codice, considera openFrameworks . È un linguaggio di programmazione grafico opensource basato su C / C ++. Ha addons che permettono alle persone di estendere la lingua. Hanno un addon per l’iphone . Credo che venga fornito con la libreria e i progetti XCode che ti aiuteranno a compilare app per iPhone e iPod touch.