2010-04-23 11 views

Respuesta

4

Usted podría tener - [MiClase startAsynchronousCode] invocar una devolución de llamada:

typedef void(*DoneCallback)(void *); 

-(void) startAsynchronousCode { 
    // Lots of stuff 
    if (finishedCallback) { 
    finishedCallback(self); 
    } 
} 

y luego una instancia de un MiClase así:

MyClass *myClass = [[MyClass alloc] initWith: myCallback]; 

MyCallback podría tener este aspecto:

void myCallback(void *userInfo) { 
    MyClass *thing = (MyClass *)userInfo; 
    // Do stuff 
    [thing release]; 
} 
+1

Cuando el método 'MyCallback' termina planteo la ejecución del código de retorno al final del método que llama la devolución de llamada: 'startAsynchronousCode 'que acaba de ser revelado? – Robert

+1

Sí, por eso es importante que realmente haya terminado antes de invocar la devolución de llamada. No obtendrás ninguna infracción de acceso a menos que te refieras a ti mismo después de la devolución de llamada. –

+1

Creo que estás preguntando "¿cómo es startAsynchronousCode asynchronous?" en tu comentario? La expresión anterior está pensada para cuando crea un hilo y ejecuta startAsynchronousCode desde ese nuevo hilo. –

0

Lo que siempre he hecho es mantener una variable de instancia que apunta al objeto asincrónico.

- (id)init { 
    myClass = [[MyClass alloc] init]; 
    [myClass startAsynchronousCode]; 
} 

- (void)myClassDidFinish:(MyClass *)myClass { 
    [myClass release]; 
} 
1

Debe conservar sus myClass objeto internamente en el método startAsynchronousCode. Y libérelo internamente también después de que haya terminado.

Este comportamiento se utiliza en NSURLConnection, UIAlertView y otros objetos asincrónicos.

3

¿Cómo estás invocando el código asíncrono? Si usa NSThread +detachNewThreadSelector:toTarget:withObject:, encontrará que el objeto objetivo es retenido por el hilo hasta que termina y luego se libera. Entonces puede liberar el objeto inmediatamente después del mensaje asincrónico.

p. Ej.

@implementation MyClass 

-(void) startAsynchronousCode 
{ 
    [NSThread detachNewThreadSelector: @selector(threadMain:) toTarget: self withObject: nil]; 
} 

-(void) threadMain: (id) anObject 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
    // do stuff 
    [pool drain]; 
} 
@end 

Con lo anterior, el siguiente código es perfectamente seguro:

MyClass* myClass = [[MyClass alloc] init]; 
[myClass startAsynchronousCode]; 
[myClass release]; 
+0

Es de mucha ayuda ... Gracias. – jfalexvijay

Cuestiones relacionadas