2012-03-28 22 views
5

Wo finde ich ein konkretes Dokument oder eine Do und Donts Dokumentation zur Verwendung von C++ mit Objective-C?Mischen von C++ und Objective C

Apple scheint dieses Dokument von ihrer Website entfernt zu haben, und ich bin erstaunt über die Sammlung von Informationen aus Blogs und Fragen, die hier gepostet wurden.

Jeder kann über das gleiche führen.

Wann wir .mm Datei verwenden, während Syntax Mischen oder bei der Verwendung eines Objekts in .m-Datei, die zu einer C++ Klasse gehört?

Beim Übergeben von Objekten zwischen Funktionen, die zu zwei verschiedenen Sprachen gehören, wie das Übergeben von objective-c Objekt an eine Funktion in cpp-Datei, ist es notwendig, sie in void * zu sammeln oder (ObjectiveC intface) *?

+0

Was meinen Sie mit "bei der Verwendung eines Objekts in einer .m-Datei, die zu einer C++ - Klasse gehört"? – pmdj

+0

@pmjordan: wenn ich eine Zusammensetzung von C++ - Objekt in objective-c-Schnittstelle mache. #import "cplusplus.h“ Schnittstelle xyz: NSObject { { Cplusplus * myobj; }} – tusharfloyd

Antwort

6

Sie müssen Objective-C++ verwenden, wenn Sie entweder #include/#import ing sind oder direkt sowohl Objective-C und C++ Code in der gleichen Datei zu schreiben. Es ist normalerweise offensichtlich mit explizitem Code; Die #include sind oft weniger, und Sie müssen darauf achten, dass eine der Sprachen nicht zu sehr in die andere übergeht. Ihr Beispiel #import eine C++ - Header-Datei ist klar: Sie können das nur mit Objective-C++ tun. Beachten Sie, dass, wenn Ihr Cplusplus ein struct-Typ ist, Sie es als einen solchen anstelle von #import in einem C++ - Header weiterleiten können.

Wenn Sie dies in einer Kopfzeile tun, "vergiftet" es die Kopfzeile, nur in diesem Modus zu arbeiten. Sie müssen dies aktiv vermeiden oder Ihr gesamtes Projekt wird bald nur mit .mm-Dateien enden. I have documented some techniques in this article und previously, in this earlier article. Für neuere Versionen von Objective-C können Sie den Klassen in den Kategorieerweiterungen auch Ivars hinzufügen. Dies bedeutet, dass Sie C++ - typisierte Ivars in Ihrer .mm-Datei definieren können, nicht die Kopfzeile, die .m-Dateien zu #import es ermöglicht.

Für Ihre zweite Frage (Bitte fragen Sie nur noch eine Frage zu einem Zeitpunkt): die id Typ in der in Bezug auf die C objc.h Header-Datei definiert ist und somit sowohl in Objective-C und C++ arbeiten. Ebenso wird die Objective-C-Laufzeit-API in Form von C-Funktionen dargestellt, die auch von C++ aus funktionieren. Wenn Sie tatsächlich Nachrichten senden und auf Objective-C-Objekte mit der kanonischen Syntax aus C++ - Code zugreifen möchten, müssen Sie diese Datei auf Objective-C++ umstellen.

+0

statt #import wenn i @class (forward-Deklaration) tun dann – tusharfloyd

+0

' @ CLASS' vorwärts deklariert ein Objective-C-Klasse (und ist illegal in pure C++). 'class' forward deklariert eine C++ - Klasse, hat aber in Objective-C keine besondere Bedeutung (Sie können technisch eine Variable" class "nennen.) In C++ sind Strukturen und Klassen fast identisch und Strukturen werden vererbt von C in Objective-C. Wenn Sie also Ihre C++ - Klasse als 'struct' definieren, können Sie * sie in einem Objective-C-Header weiterleiten. – pmdj

+0

Phil hat seinen Artikel seit diesem Post aktualisiert, der neue ist da : http://philjordan.eu/article/mixing-objective-c-c++and-objective-c++ –

3

Verwenden Sie .mm-Dateien, wenn Sie eine C++ - Syntax in Ihrem Code haben oder wenn Sie Dateien einschließen, die C++ - Code enthalten.

Das Mischen von C++ mit objective-c mag ein wenig verwirrend sein, aber wenn Sie denken, Zeiger-als ist es keine große Sache. Behandle C++ - Objektinstanzmethoden wie in C++ und dasselbe gilt für objektive c-Objekte.