2013-11-24 9 views
5

Ich habe Objective-C Klasse in meinem iOS Projekt, das Objective-C und C Code in der gleichen Klasse implementiert. Ich habe die Erweiterung auf .mm geändert und dieser Teil geht gut. Jetzt möchte ich eine C Methode festlegen, die die Objective-C Methode in der gleichen Klasse aufrufen wird. Das Problem, das ich bekomme, ist, wenn ich versuche, self von der C Methode zu benennen. Hier ist der Code:So nennen Sie Objective-C "Selbst" von C-Methode

void SetNotificationListeners(){ 
    [self fireSpeechRecognition]; 
} 

der Fehler ist:

Use of undeclared identifier 'self' 

wie kann ich das schaffen?

+0

Das ist iOS, nicht IOS. Wie auch immer, warum erwarten Sie, dass "self" von einer Funktion aus zugänglich ist, die ** nicht ** zur Klasse gehört? Das macht einfach keinen Sinn. Sie müssen die Instanz (das Objekt) selbst als Argument übergeben. –

+2

Warum haben Sie die Erweiterung auf ".mm" geändert, wenn Sie Objective-C und C verwenden (C++ wird nicht erwähnt)? – trojanfoe

Antwort

10

Sie haben die Instanz Zeiger auf die C-Funktion übergeben:

void SetNotificationListeners(void *uData) 
{ 
    MyClass *obj = (__bridge MyClass *)(uData); 
    [obj fireSpeechRecognition]; 
} 

- (void)myMethod 
{ 
    // Call C function from Objective-C method: 
    myFunction((__bridge void *)(self)); 
} 

(Die „Brücke“ Zeug wird nur benötigt, wenn Sie mit ARC kompilieren.)

+0

Diesen Beitrag lesend frage ich, wo in C Sie Objective C nennen? Hier hast du gesagt "Call C Funktion von Objective-C" ... verstehe nicht ... das macht mich verwirrt! rs –

0

entweder selbst als Argument für den Funktionsaufruf geben:

void SetNotificationListeners(void *myObj){ 
[(MyClass*)myObj fireSpeechRecognition]; 
} 

//in objC 
SetNotificationListeners(self); 

oder eine globale Variable, die Referenz

//global variable 
static MyClass *myObj; 

//in obj c 
myObj = self; 
SetNotificationListeners(); //use myObj instead of self in function 

Die erste ist meiner Meinung nach besser hält.

+3

Die zweite ist Wahnsinn :) – zoul

+0

Wie gesagt, ich bevorzuge die erste Option. Lustig, wie ich runter gekommen bin, wenn die markierte Antwort mit 10 Stimmen im jetzt gefundenen Duplikat dieser Frage nur den gleichen "Wahnsinn" erwähnt ... – Mario

1

In Objective-C-Methoden gibt es zwei Parameter, die implizit in jede Methode übergeben werden, nämlich self und _cmd. Aus diesem Grund können Sie innerhalb einer Methode auf self zugreifen. Wenn Sie von einer Objective-C-Methode aus aufrufen, können Sie einfach self als Argument an Ihre c-Funktion übergeben, aber bei diesem trivialen Beispiel bin ich mir nicht sicher, warum Sie nicht einfach eine Methode verwenden würden.

Sie brauchen nicht die Dateierweiterung .mm zu ändern, wenn Sie Objective-C++ verwenden

2

Sie müssen die Dateierweiterung nicht ändern. Objective-C ist eine Obermenge von C, was bedeutet, dass Sie in Ihren Objective-C-Dateien einfach C verwenden können.

Wenn Sie eine Implementierung einer Objective-C-Methode schreiben, wird diese Methode immer im Kontext einer bestimmten Instanz ausgeführt, das ist der self Teil. Sie erhalten die self in einer Objective-C-Methode automatisch, aber hinter den Kulissen wird es nur als Argument an die Methode übergeben, siehe obc_msgsend.

Ihre einfache C-Funktion ist kein Teil der Klasse (einfache C-Funktionen sind nie), daher ist keine Instanz damit verbunden, wenn Sie sie aufrufen, es gibt keine implizite self. Wenn Sie möchten, dass die Funktion eine Instanz aufruft, müssen Sie den Zeiger explizit an diese Instanz übergeben. Zum Beispiel haben einige der einfachen C-APIs einen "Kontext" -Zeiger, den Sie weitergeben können, wenn Sie sich für einen Rückruf registrieren. Beispiele dazu finden Sie in den nebenstehenden Antworten.

Verwandte Themen