Es un patrón común en mi código para asignar un objeto, deja que haga un poco de materia con un manejador de terminación y lo liberan en el controlador:¿Cómo puedo liberar un objeto con un controlador de finalización de bloque en ARC?
LongOperation *foo = [[LongOperation alloc] init];
[foo runWithCompletion:^{
// run some code and then:
[foo autorelease];
}];
Esto funciona bastante bien, pero cuando intento de convertir el código a ARC, Xcode se queja con razón de que no puede simplemente dejar caer el autorelease
del bloque, ya que eso haría que el objeto foo
fuera desasignado después de abandonar el alcance.
Entonces, ¿cuál es una buena manera de escribir este tipo de patrón en ARC? Podría introducir una variable de instancia para foo
:
[self setFoo:[[LongOperation alloc] init]];
[foo runWithCompletion:^{
// run some code and then:
[self setFoo:nil];
}];
... pero el código no sería re-entrante más.
Esto no responde a la pregunta es qué hacer cuando el contexto que contiene foo se ha ido. Con esta solución, el marco de pila que llama a [foo runWithCompletion:] debe bloquearse hasta que la ejecución se complete o se arriesgue a un apilamiento de pila. –