2011-04-27 9 views
7

¡Hola a todos! Soy bastante nuevo en Objective-c, así que nunca he tenido que abordar este tema todavía. Tengo una función C en mi clase objetivo-c y quiero poder invocar un método en una propiedad de la clase object-c que lo contiene.¿Cómo le doy a la función C un puntero a 'self' (llamando a obj) en objetivo-c?

entiendo que mi función C no va a entender lo que es 'yo' si intento simplemente enviar un mensaje [self.delegate doSomething]

Asumo lo que tengo que hacer es dar mi función c un puntero a mi clase para que pueda hacer algo como esto:

myClass-> delegate -> doSomething();

Me gustaría almacenar un puntero al objeto actual (self) en una variable global porque no puedo cambiar las firmas de función. Quiero poder acceder al puntero desde cualquier función C definida dentro de esta clase. La razón de esto es que estoy escribiendo un envoltorio alrededor de una biblioteca de C que intento usar. Si puede ser ayudado ... Prefiero no modificar la fuente a esta biblioteca.

¿Alguien puede ayudarme con cómo obtener un puntero al objeto actual? ¡Gracias!

void event_privmsg (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) 
{ 
    //[self.delegate privateMessage]; I would like to do the following 
} 

Respuesta

16

self es un puntero al objeto del método actual, mientras que dentro de un método. Así que se puede asignar a que una variable global mecanografiado como su clase:

// Global scope 
static MyClass *globalSelf; 

// C function 
void foo() { 
    [globalSelf->delegate doSomething]; 
} 

// ObjC method 
- (void)setMyselfUpAsTheGlobalVariable { 
    globalSelf = self; 
    foo(); 
} 

Si bien esto debería funcionar, debo señalar que esto es más bien fea y hay que tener cuidado de que la variable global no va a ser pisoteado por un código concurrente. La mayoría de las API de estilo C le permitirán pasar una variable void* como un parámetro definido por el usuario. Si esto es cierto con la API que está ajustando, este sería el lugar ideal para almacenar la instancia del objeto Objective-C en lugar de una variable global.

+0

Im dándole un disparo. Lamentablemente, la función C en mi publicación es la firma real y, como puede ver, no admite una var. Definida por el usuario. Gracias por la respuesta – Nick

0

declararemos como a continuación

MyObjectiveCClass self; 

utilizar la variable auto externo para llamar a la función obj-C

void event_privmsg (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) 
{ 
    [self.delegate privateMessage]; //I would like to do the following 
} 

También puedes ver el SO puesto,

Unable to call an Objective C method from a C function

+0

Lo anterior da como resultado un error del compilador: Solicitud de miembro 'delegado' en algo que no es una estructura o unión. – Nick

+0

Esto se debe al hecho de que con la var declarada como id de tipo, el miembro es desconocido. – Nick

+0

@Nick: bien, podría tener su nombre de clase en lugar de id. – Jhaliya

Cuestiones relacionadas