2008-11-20 12 views
15

Estoy usando la arquitectura MVC para una aplicación GUI. La clase de modelo tiene algunas funciones de C. Una de las funciones C llama a algunos métodos de la clase Objective-C. Llamo a esos métodos usando un objeto de esa clase. Lo extraño es que los métodos anteriores al método xyz se llaman perfectamente, pero cuando se llama a ese método xyz, ese método y los métodos posteriores no se ejecutan. No obtengo ningún error. Entonces no puedo entender qué está pasando exactamente. ¿Alguna idea sobre cuál podría ser la razón para esto?No se puede llamar a un método de Objective C desde una función C

+0

Se puede publicar algo de código ? De lo contrario, será imposible ayudar. –

+0

En segundo lugar esa solicitud. Algún código simple será de mucha ayuda. P.ej. solo un código de la función C que muestra cómo se accede realmente al objeto obj-c y cómo se hace la llamada podría ser muy útil – Mecki

Respuesta

1

Definitivamente puede ejecutar métodos en objetos Obj-C desde una función C, por lo que es probable que haya un error en su código en algún momento. Si tuviera que adivinar, parece que un objeto es nulo cuando no se espera que lo sea. Normalmente, comenzarías estableciendo puntos de interrupción en tu función, para que puedas averiguar cuál es el estado de los objetos en cuestión.

55

Como señala Marc, probablemente esté utilizando una referencia al objeto OBJC que no se ha inicializado fuera del alcance de Object-c.

He aquí una muestra de trabajo de código C llamar al método de un objeto ObjC:

#import <Cocoa/Cocoa.h> 

id refToSelf; 

@interface SomeClass: NSObject 
@end 

@implementation SomeClass 
- (void) doNothing 
{ 
     NSLog(@"Doing nothing"); 
} 
@end 

int otherCfunction() 
{ 
     [refToSelf doNothing]; 
} 


int main() 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    SomeClass * t = [[SomeClass alloc] init]; 
    refToSelf = t; 

    otherCfunction(); 

    [pool release]; 
} 
+2

amigo, rockeador. Perdí un buen día con esto y tu código acaba de rescatar un día de otra manera horrible. Ojalá pudiera votarte 100 veces más. – eviljack

+1

¡Otros 100 votaciones de mi parte! Esto fue increíblemente útil. – willc2

+1

Por cierto, esto solo funcionará para un singleton. Si instancia más de un objeto, refToSelf Pointer solo señalará el último objeto. – Brian

1

punto de interrupción en el método antes de la XYZ, y luego empezar paso a paso en el depurador. Es sorprendente la cantidad de errores que puede detectar al pasar por el código en el depurador. De hecho, esta es una técnica recomendada para evitar errores que consiste en pasar un solo paso por el código para cualquier código nuevo que se escriba.

Estoy de acuerdo con Marc, la causa clásica de "ese método y los métodos después de que no se ejecutan" es que la referencia del objeto es nula, ya que [nil doAnything] no hará nada y no informará ningún error.

0

Hay una manera simple de hacer esto:

@implementation 
// Define a object 
ClassName *thisClass; 

y luego init con la auto

thisClass = self; 

Se puede utilizar cualquier var y métodos en C-Método

Cuestiones relacionadas