¿Cómo llamar a un método Objective-C desde un método C?

Tengo un objeto Obj-C con un montón de métodos dentro de él. Algunas veces un método necesita llamar a otro método dentro del mismo objeto. Parece que no puedo entender cómo obtener un método C para llamar a un método Obj-C …

OBRAS: Método Obj-C llamando a un método Obj-C:

[self objCMethod]; 

OBRAS: método Obj-C llamando a un método C:

 cMethod(); 

NO FUNCIONA: método C llamando a un método Obj-C:

 [self objCMethod]; // <--- this does not work 

El último ejemplo hace que el comstackdor escuche este error:

error: ‘auto’ no declarado (primer uso en esta función)

Dos preguntas. ¿Por qué la función C no puede ver la variable “self” aunque esté dentro del objeto “self”, y cómo la llamo sin causar el error? Muchas gracias por cualquier ayuda! 🙂

    Para que eso funcione, debes definir el método C de esta manera:

     void cMethod(id param); 

    y cuando lo llames, llámalo así:

     cMethod(self); 

    entonces, podrías escribir:

     [param objcMethod]; 

    En tu cMethod .

    Esto se debe a que la self variable es un parámetro especial que se pasa automáticamente a los métodos de Objective-C. Como los métodos C no disfrutan de este privilegio, si desea usar self , debe enviarlo usted mismo.

    Consulte más en la sección Implementación de métodos de la guía de progtwigción .

    Sé que su pregunta ya fue respondida por Aviad, pero solo para agregar a la información ya que esto no está relacionado:

    En mi caso, necesitaba llamar a un método Objective-C desde una función C que no me llamé a mí mismo (una función de Evento de Carbono desencadenada al registrar un evento global de teclas rápidas) por lo que pasar auto como parámetro era imposible. En este caso particular, puedes hacer esto:

    Defina una variable de clase en su implementación:

     id thisClass; 

    Luego, en tu método init, configúralo en uno mismo:

     thisClass = self; 

    A continuación, puede llamar a los métodos Objective-C desde cualquier función C de la clase sin necesidad de pasar self como parámetro de la función:

     void cMethod([some parameters]) { [thisClass thisIsAnObjCMethod]; } 

    La función C no está “dentro del objeto self “. De hecho, nada es.

    Los métodos de Objective-C efectivamente se self como un argumento implícito, con magia hecha bajo el capó. Para las funciones C simples, no están asociadas a ninguna clase u objeto, y no hay magia de invocación, entonces no hay self . Si lo necesita, debe pasarlo a su función C explícitamente como argumento.

    Para ser totalmente sincero, no existe el método C. C tiene funciones. Para ilustrar la diferencia, mira los siguientes ejemplos:

    Este es un progtwig C en funcionamiento que define un tipo y dos funciones que lo acompañan:

     #include  typedef struct foo_t { int age; char *name; } Foo; void multiply_age_by_factor(int factor, Foo *f) { f->age = f->age * factor; } void print_foo_description(Foo f) { printf("age: %i, name: %s\n", f.age, f.name); } int main() { Foo jon; jon.age = 17; jon.name = "Jon Sterling"; print_foo_description(jon); multiply_age_by_factor(2, &jon); print_foo_description(jon); return 0; } 

    Aquí hay una implementación de Objective-C de ese progtwig:

     #import  @interface Foo : NSObject { NSUInteger age; NSString *name; } @property (nonatomic, readwrite) NSUInteger age; @property (nonatomic, copy) NSString *name; - (void)multiplyAgeByFactor:(NSUInteger)factor; - (NSString *)description; - (void)logDescription; @end @implementation Foo @synthesize age; @synthesize name; - (void)multiplyAgeByFactor:(NSUInteger)factor { [self setAge:([self age] * factor)]; } - (NSString *)description { return [NSString stringWithFormat:@"age: %i, name: %@\n", [self age], [self name]]; } - (void)logDescription { NSLog(@"%@",[self description]); } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Foo *jon = [[[Foo alloc] init] autorelease]; [jon setAge:17]; [jon setName:@"Jon Sterling"]; [jon logDescription]; [jon multiplyAgeByFactor:2]; [jon logDescription]; [pool drain]; return 0; } 

    La salida del progtwig C puro fue:

     age: 17, name: Jon Sterling age: 34, name: Jon Sterling 

    El resultado del progtwig Objective-C fue:

     2009-08-25 17:40:52.818 test[8963:613] age: 17, name: Jon Sterling 2009-08-25 17:40:52.828 test[8963:613] age: 34, name: Jon Sterling 

    La única diferencia es toda la basura que NSLog pone antes del texto. La funcionalidad es exactamente la misma. Entonces, en C, puede usar algo así como métodos similares, pero en realidad son solo funciones que incluyen un puntero a una estructura.

    No creo que esto haya respondido a su pregunta original, pero sí resolvió algunos problemas de terminología que parece haber estado teniendo.

    Otra opción para las respuestas dadas hasta ahora es usar la función objc_msgSend() proporcionada por el tiempo de ejecución de Objective-C.