5

esta es probablemente una pregunta para principiantes con respecto al manejo de la memoria.Cómo liberar objetos al utilizar la devolución de llamada de bloque

¿Cómo puedo liberar un objeto cuando uso bloques como devolución de llamada en el objetivo c?

(código actualizado)

@implementation ObjectWithCallback 
- (void)dealloc { 
    [_completionHandler release]; 
    [super dealloc]; 
} 
- (void)doTaskWithCompletionHandler:(void(^)(void))handler { 
    _completionHandler = [handler copy]; 
    // Start tasks... 
} 
- (void)tasksDone { 
    // Do callback block 
    _completionHandler(); 
    // Delete reference to block 
    [_completionHandler release]; 
    _completionHandler = nil; 
} 

// Use of the ObjectWithCallback 
ObjectWithCallback *request = [[ObjectWithCallback alloc] init]; 
[request doTaskWithCompletionHandler:^(void){ 
    // Callback called and task is ready. 
}]; 
+0

¿Qué objeto desea lanzar y por qué no puede liberarlo dentro del bloque? – Richard

+0

¿Qué te hace pensar que no puedes ejecutar el objeto en el bloque? – bbum

+0

Quiere lanzar 'solicitud'. – Caleb

Respuesta

11

rápida, respuesta incompleta: [request autorelease]

El problema con esto es que los bloques de forma implícita conservan los objetos que se hace referencia en el interior del cuerpo del bloque. Por lo tanto, el bloque conserva request, y request retiene el bloque, lo que lleva a un ciclo de retención y nadie se desasigna.

Para remediar esto, se declara la variable de request como __block, que impide que el bloque de retener el objeto capturado:

__block ObjectWithCallback *request = [[ObjectWithCallback alloc] init]; 

Lectura recomendada:

+0

__bloque no se debe utilizar en este cas. La vida útil del objeto está claramente vinculada al bloque y la retención del bloque lo asegura. – bbum

+0

@bbum Creo que entiendo lo que quiere decir, pero ¿esto no causaría un ciclo de retención si el bloque hace referencia a 'request'? Creo que una forma de evitar esto sería 'ObjectWithCallback' para liberar el bloque de devolución de llamada después de llamarlo. –

+0

Ahh - sí - problema diferente ortogonal a la pregunta de OP. Derp. – bbum

Cuestiones relacionadas