2016-10-19 6 views
1

Ich verwende NSURLSession, um eine Verbindung zu einer Datenbank herzustellen.
Ich habe dies bereits in C++ für Windows implementiert und versuche es auch auf iOS zu bekommen.
Ich habe eine .h-Datei, die von einer Basis-C++ - Klasse abgeleitet ist, die die Kopfzeile für meine .mm-Datei ist.
Wenn ich richtig bin, muss ich alle Funktionen in meiner .h-Datei in C++ implementieren.
NSURLSession ist jedoch eine Objective-C-Funktion.

Wie kann ich eine Objective-C-Methode von meiner C++ - Funktion aufrufen?Objective C++: Call Objective C-Methode von C++

Ich habe eine C++ - Funktion namens Connect(), wo ich ein C++ - Objekt m_Delegate, die eine Zuweisung und init hat.

this->m_Delegate = [[PrivateNSURLSessionDelegate alloc] initWihParent:this]; 
//where PrivateNSURLSessionDelegate is the name of my interface. 

Diese Schnittstelle hat - (bool) NSConnect (bei der Umsetzung in der @implementation), die ich versuche, aus anrufen:

void Connect() 
{ 
    [PrivateNSURLSessionDelegate NSConnect]; 
    //This however gives me the error: +[PrivateNSRLSessionDelegate NSConnect]: unrecongnized selector sent to class 
} 

ich es auch versucht, meine C++ Objekt

void Connect() 
{ 
    [m_Delegate NSConnect]; 
    //This gives me a error that is unrecognized selector sent to instance 
} 

Gibt es einen besseren Weg, dies zu tun? Ich möchte grundsätzlich das Objective-C bitten, alle NSURL-Sachen zu machen und nur die Daten zurück an C++ zu senden.

Ich bin völlig neu in Objective-C, so dass alle und alle Hilfe sehr geschätzt werden würde! Vielen Dank!

+0

Dumme Frage, aber haben Sie dafür gesorgt, dass die Erweiterung Ihrer Objective-C++ - Klasse auf '.mm' gesetzt wird? –

+0

Ich habe das dreifach überprüft. Lol. Es ist ein .mm :). – annaisarobot

Antwort

2
-(bool)NSConnect 

Hier zeigt die - an, dass es sich um eine Instanzmethode handelt. Umgekehrt würde + eine Klassenmethode anzeigen.

Das heißt, [PrivateNSURLSessionDelegate NSConnect]; ruft eine Klassenmethode, da Sie es auf der Schnittstelle PrivateNSURLSessionDelegate aufrufen. Dies ist jedoch nicht definiert, da es definiert ist als NSConnect ist definiert als eine Instanz-Methode (die Konvention ist, dass (Instanz) Methoden immer mit einem Kleinbuchstaben beginnen).

[m_Delegate NSConnect]; 

Ruft jedoch die Instanzmethode auf. Sie sollten in der Header-Datei PrivateNSURLSessionDelegate, nicht über der @implementation in der Implementierungsdatei definieren, die in einer privaten Methode und damit nicht zugänglich ist.

+0

Danke für die schnelle Antwort! – annaisarobot

+0

Hoppla. Ich wollte nicht "Enter" drücken. Also ich will eine Instanz-Methode, die dann sollte - (bool) NSConnect, die in der @ Implementierung sein sollte? Und ich habe es so in der @ interface definiert. Ist das korrekt? Tut mir leid, ich bin wirklich neu. – annaisarobot

+0

Ja, das klingt richtig. Siehe zum Beispiel das [this] (http://blog.teamtreehouse.com/beginners-guide-objective-c-classes-objects) Tutorial, insbesondere den Teil zu Implementierungsdateien. Die Antwort von @gnasher729 passt vielleicht eher zu deinem C++ Problem. – Thomm

0

Es gibt Objective-C, eine Obermenge von C, und Objective-C++, die eine Obermenge von C++ ist. Objective-C++ - Quellcodedateien haben das Suffix .mm, wobei Objective-C das Suffix .m hätte.

Sie können Objective-C nicht aus C++ aufrufen. Sie können jedoch Objective-C von Objective-C++ aufrufen, und Sie können Ihre üblichen C++ - Klassen auch in Objective-C++ schreiben.

+0

Okay, cool! Danke für die Klarstellung. Ich rate, was ich versuche, eine Objective-C-Methode von Objective-C++ aufzurufen. – annaisarobot

+0

Objective-C++ ist keine Obermenge von C++. Objective-C++ ermöglicht es Ihnen, C++ mit Objective-C-Code zu mischen, ansonsten sind sie vollständig getrennt. Zum Beispiel können Sie nicht von C++ in Objective-C und umgekehrt erben. –