2013-11-24 16 views
5

Ho classe Objective-C nel mio progetto iOS che implementa il codice Objective-C e C nella stessa classe. Ho cambiato l'estensione in .mm e questa parte va bene. Ora voglio impostare un metodo C che chiamerà il metodo Objective-C nella stessa classe. Il problema che ho riscontrato è quando sto cercando di chiamare self dal metodo C. ecco il codice:Come chiamare "auto" Objective-C dal metodo C

void SetNotificationListeners(){ 
    [self fireSpeechRecognition]; 
} 

l'errore è:

Use of undeclared identifier 'self' 

come posso gestire questo?

+0

Questo è iOS, non IOS. Ad ogni modo, perché ti aspetti che "sé" sia accessibile da una funzione che ** non ** appartiene alla classe? Questo non ha senso. Dovrai passare l'istanza (oggetto) stessa come argomento. –

+2

Perché hai cambiato l'estensione in '.mm' quando usi Objective-C e C (non parli di C++)? – trojanfoe

risposta

10

devi passare il puntatore di istanza per la funzione C:

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

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

(Il "brigde" roba è necessaria solo se si compila con ARC.)

+0

Leggendo questo post chiedo, dove in C si chiama Objective C? Qui hai detto "Chiama la funzione C DALL'Obiettivo-C" ... non capisco ... questo mi rende confuso! rs –

0

O dare di sé come argomento per la chiamata di funzione:

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

//in objC 
SetNotificationListeners(self); 

o avere una variabile globale che contiene riferimento

//global variable 
static MyClass *myObj; 

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

La prima è meglio a mio parere.

+3

Il secondo è follia :) – zoul

+0

Come ho detto Id preferisco la prima opzione. Divertente come scendo votato quando la risposta marcata con 10 voti in su nel duplicato ora trovato di questa domanda menziona solo la stessa "follia" .... – Mario

1

In metodi Objective-C ci sono due parametri che sono passati implicitamente in ogni metodo, che sono self e _cmd. Questo è il motivo per cui è possibile accedere a self da un metodo.

È sufficiente passare self come argomento alla funzione c quando si chiama da un metodo Objective-C, ma con questo banale esempio non sono sicuro del perché non si utilizzerebbe un metodo.

Non è necessario modificare l'estensione del file per .mm a meno che non si sta usando Objective-C++

2

Non è necessario modificare l'estensione del file. Objective-C è un superset di C, il che significa che puoi usare la semplice C nei tuoi file Objective-C come preferisci.

Quando si scrive un'implementazione di un metodo Objective-C, tale metodo viene sempre eseguito nel contesto di una particolare istanza , ovvero la parte self. Si ottiene self in un metodo Objective-C automagicamente, ma dietro le quinte è appena passato come argomento al metodo, vedere obc_msgsend.

La tua semplice funzione C non fa parte della classe (le normali funzioni C non lo sono mai), quindi non è associata alcuna istanza quando la chiami, non è implicito self. Se si desidera che la funzione richiami un'istanza, è necessario passare esplicitamente il puntatore a tale istanza. Ad esempio, alcune delle API C semplici hanno un puntatore "contesto" che puoi passare durante la registrazione per un callback. Vedi le risposte vicine per esempi di questo.

Problemi correlati