Aufruf einer Objective-C-Funktion aus C ++ - Code

8

Ich habe gegoogelt und ich finde eine Million Ergebnisse zu diesem Thema. Aber keine der Seiten hilft mir. Ich denke, dass ich ein sehr häufiges Problem habe. Ich experimentiere mit Audioprogrammen, insbesondere mit Audio-Warteschlangen. Der Zweck meines Programms spielt keine Rolle für die Erklärung des Problems. Aber kurz gesagt: Ich bekomme einen Fehler, wenn ich versuche, eine objective-c-Funktion aus C ++ - Code aufzurufen. Also hier ist mein Code, der den Fehler enthält: AudioRecorder.h:

%Vor%

Und das ist die Implementierung: AudioRecorder.mm:

%Vor%

Wenn ich "[self playAlarmSound];" weglasse dann funktioniert alles gut. Wie kann ich diese Objective-C-Funktion aus meinem C ++ - Code aufrufen?

    
toom 05.08.2011, 15:22
quelle

2 Antworten

6

self existiert nur in Objective-C-Methoden und das ist eine C-Style-Funktion. Sie müssen self von einer Objective-C-Methode an die inUserData übergeben, wenn Sie den Callback einrichten, und ihn dann auf den richtigen Typ zurückwerfen.

%Vor%

Und Ihre ursprüngliche Implementierung

%Vor%     
Joe 05.08.2011, 15:39
quelle
4

Das ist in der Tat ein häufiges Problem. self funktioniert hier nicht, weil dies keine Methode der Klasse AudioRecorder ist, nicht weil es Objective-C-Code ist. Sie befinden sich in einer Objective-C ++ - Datei, daher funktioniert der gesamte gültige Objective-C-Code. [anAudioRecorder playAlarmSound] funktioniert gut, vorausgesetzt, Sie haben eine gute Referenz auf anAudioRecorder .

Wie erhalten wir eine Referenz, wenn wir keinen Zugriff auf self haben? Der übliche Weg besteht darin, das Argument void* aqData dieser Funktion als Zeiger auf Ihr Objekt AudioRecorder zu verwenden. Wenn Sie diesen Rückruf registriert haben, haben Sie ihm gesagt, was das Argument void* wäre, in diesem Fall ein Zeiger auf Ihr Objekt AQRecorderState oder struct, das Sie sowieso nicht zu benutzen scheinen. Stattdessen können Sie bei der Registrierung einen Zeiger auf self verwenden, damit Sie dieses Objekt hier verwenden können.

Eine andere Option wäre die Verwendung eines gemeinsamen Objekts AudioRecorder . In diesem Fall würden Sie etwas wie [AudioRecorder sharedInstance] (eine Klasse, keine Instanz, Methode) aufrufen, um das gewünschte Objekt AudioRecorder zu erhalten. Da die andere Antwort hier die erste Methode beschreibt, wird hier die Verwendung der Option shared instance beschrieben: Fügen Sie eine statische Instanz von AudioRecorder und eine Klassenmethode sharedInstance zu Ihrem AudioRecorder -Objekt hinzu, wie folgt:

%Vor%

Wenn Sie dann AudioRecorder von Ihrem Rückruf verwenden möchten, können Sie die gemeinsam genutzte Instanz mit [AudioRecorder sharedInstance] abrufen. Dies ist ein sehr nützliches Paradigma, wenn es nur ein AudioRecorder gibt - es eliminiert eine Menge von Referenzübergaben.

    
Luke 05.08.2011 15:38
quelle

Tags und Links