Sie können eine Cocoa-Anwendung nicht vollständig in C ++ schreiben. Cocoa verlässt sich bei vielen seiner Kerntechnologien wie Schlüsselwertbindungen, Delegierten (Kakao-Stil) und dem Zielaktionsmuster stark auf die späten Bindungsfunktionen von Objective-C. Die späten Bindungsanforderungen machen es sehr schwierig, die Cocoa-API in einer zur Kompilierungszeit gebundenen, typisierten Sprache wie C ++ implement zu implementieren. Sie können natürlich eine reine C ++ - App schreiben, die unter OS X ausgeführt wird. Die Cocoa-APIs können einfach nicht verwendet werden.
Sie haben also zwei Möglichkeiten, wenn Sie Code zwischen C ++ - Apps auf anderen Plattformen und Ihrer Cocoa-basierten Anwendung freigeben möchten. Die erste besteht darin, die Modellebene in C ++ und die GUI in Cocoa zu schreiben. Dies ist ein gängiger Ansatz, der von einigen sehr großen Apps verwendet wird, einschließlich Mathematica . Ihr C ++ - Code kann unverändert bleiben (Sie benötigen keine "funky" Apple-Erweiterungen, um C ++ unter OS X zu schreiben oder zu kompilieren). Ihre Controller-Schicht wird wahrscheinlich Objective-C ++ verwenden (möglicherweise die "funky" Apple-Erweiterung, auf die Sie sich beziehen). Objective-C ++ ist eine Obermenge von C ++, genau wie Objective-C eine Obermenge von C. In Objective-C ++ können Sie [some-objc-object callMethod];
innerhalb einer C ++ - Funktion Aufrufe zum Weiterleiten von Nachrichten im Objektstil (wie ) ausführen . Umgekehrt können Sie C ++ - Funktionen aus dem ObjC-Code heraus aufrufen, z.
@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
Sie können mehr über Objective-C ++ in der Objective-C - Sprache herausfinden Führung . Die Ansichtsebene kann dann reines Objective-C sein.
Die zweite Option ist die Verwendung eines plattformübergreifenden C ++ - Toolkits. Der QtToolkit könnte die Rechnung passen. Plattformübergreifende Toolkits werden von Mac-Benutzern im Allgemeinen verachtet, da sie nicht alle Details des Erscheinungsbilds genau richtig wiedergeben und Mac-Benutzer eine Verbesserung der Benutzeroberfläche von Mac-Anwendungen erwarten. Qt leistet jedoch überraschend gute Arbeit und kann je nach Zielgruppe und Verwendung Ihrer App gut genug sein. Darüber hinaus verlieren Sie einige der OS X-spezifischen Technologien wie Core Animation und einige QuickTime-Funktionen, obwohl die Qt-API ungefähr ersetzt wird. Wie Sie hervorheben, wird Carbon nicht auf 64-Bit portiert. Da Qt auf Carbon-APIs implementiert ist, mussten Trolltech / Nokia Qt auf die Cocoa-API portieren, um die 64-Bit-Kompatibilität zu gewährleisten. Mein Verständnis ist, dass die nächste Veröffentlichung von Qt (derzeit in Release Candiate)) schließt diesen Übergang ab und ist unter OS X 64-Bit-kompatibel. Wenn Sie an der Integration von C ++ und den Cocoa-APIs interessiert sind, sollten Sie sich die Quelle von Qt 4.5 ansehen.
ⁱ Für eine Weile stellte Apple die Cocoa-API Java zur Verfügung, aber die Bridge erforderte umfangreiche Hand-Tuning und war nicht in der Lage, die oben beschriebenen fortschrittlicheren Technologien wie Key-Value-Bindungen zu verarbeiten. Derzeit dynamisch typisierte, an die Laufzeit gebundene Sprachen wie Python, Ruby usw. sind die einzige echte Option zum Schreiben einer Cocoa-App ohne Objective-C (obwohl diese Bridges natürlich Objective-C unter der Haube verwenden).
Nun, es mag albern klingen, aber tatsächlich können wir reinen C ++ - Code schreiben, um eine GUI für Mac OS X zu erstellen, aber wir müssen eine Verknüpfung mit dem Cocoa-Framework herstellen.
quelle
objc_getClass
durch(id)objc_getClass
Ja, Sie können einfach C ++ verwenden (dh in * .cpp-Dateien schreiben) und sogar C ++ und Objective-C in * .mm-Dateien mischen (Standard-Objective-C-Code wird in * .m-Dateien gespeichert).
Natürlich müssen Sie weiterhin Objective-C für Ihre Benutzeroberfläche verwenden und Objective-C-Wrapper für Ihre C ++ - Objekte erstellen. Eine weitere Option ist der Wechsel zu Qt , einem C ++ - Framework, das Windows, Mac OS X und Linux unterstützt und mit der nächsten Version 4.5 unter der LGPL veröffentlicht wird.
quelle
Ja, du kannst sie mischen.
Sie müssen Objective-C verwenden, um Ihre GUI-Objekte direkt zu bearbeiten und Benachrichtigungen von ihnen zu erhalten.
Diese Objective-C-Objekte können die C ++ - Logik direkt aufrufen, wenn Sie sie in MM-Dateien anstelle der reinen Objective-C-MM-Dateien ablegen. Beachten Sie, dass Sie möglicherweise (viel) ältere Ratschläge sehen, die die Verwendung eines Großbuchstabens .M zur Angabe von Objective-C ++ vorschlagen. Dies ist jedoch sehr unzuverlässig und kann Sie und den Compiler wahrscheinlich verwirren.
Sie müssen nicht jedes C ++ - Objekt umbrechen, aber Ihr Objective-C-Code muss Zeiger darauf enthalten.
Apple veröffentlicht keine Beispiele mehr, die zeigen, wie das geht.
Es gibt ein großartiges Video von Peter Steinberger, das bei Realm [Objective] C ++ gehostet wird : Was könnte möglicherweise schief gehen? Ich kann es jedem empfehlen, der noch Objective-C ++ verwendet, und Sie können das Transkript schnell überfliegen.
quelle
Wenn Sie nur Vanille C ++ verwenden möchten, wird dies absolut unterstützt und unterscheidet sich nicht von jeder anderen Plattform. Xcode hat sogar eine Vorlage unter Datei> Neues Projekt> Befehlszeilenprogramm> C ++ - Tool. Einige der beliebten Open-Source-Bibliotheken (libcurl, libxml2, sqlite usw.) werden mit OS X geliefert und stehen für die dynamische Verknüpfung zur Verfügung. Sie müssen keinen Kakao oder etwas Apple-spezifisches verwenden, wenn Sie nicht möchten.
Wenn Sie Cocoa in bestimmten Bereichen Ihrer App verwenden möchten, schauen Sie sich Objective-C ++ an . Sie können C ++ und Objective-C in derselben Datei mischen, indem Sie eine Erweiterung von .mm angeben oder mit der rechten Maustaste auf die Datei in Xcode klicken und Get Info> General auswählen und dann den Dateityp in sourcecode.cpp.objcpp ändern. Die zweite Option ist nützlich, wenn Sie eine CPP-Datei haben, in der Sie Objective-C in einem Mac-spezifischen #ifdef verwenden möchten.
quelle
Obwohl dies eine jahrelange Frage ist ...
Ich habe versucht, einen C ++ - Wrapper für einige Cocoa-Klassen zu erstellen .
Es war eine ziemlich schöne Erfahrung. C ++ bot eine bessere Typensicherheit als Objective-C und brachte mich dazu, weniger Code zu schreiben. Die Kompilierungszeit und die Speichersicherheit sind jedoch schlechter. Es ist möglich, aber einige dynamikbasierte Funktionen waren nicht einfach zu handhaben. Ich denke, es macht keinen Sinn, sich unter C ++ damit zu befassen.
Auf jeden Fall wurde mein Projekt aufgrund der Ankündigung von Swift endgültig aufgegeben. Es löschte alle Gründe, warum ich zuerst C ++ verwenden wollte, und bietet noch mehr und bessere.
quelle
Wenn Sie eine rein grafische Anwendung schreiben, dh alles mit Code zeichnen, sollten Sie openFrameworks in Betracht ziehen . Es ist eine grafische OpenSource-Programmiersprache, die auf C / C ++ basiert. Es hat Addons, mit denen Leute die Sprache erweitern können. Sie haben ein Addon für das iPhone . Ich glaube, dass es mit der Bibliothek und den XCode-Projekten geliefert wird, mit denen Sie Apps für das iPhone und den iPod touch kompilieren können.
quelle