ObjC: BAD ACCESS cuando la llamada bloquea ^ {} en funciones posteriores?

Siguiendo estodiscusión, Me he encontrado con un problema de acceso mal;

Un bucle tiene varios pasos: a, b, c, ... x, y, z:

-(void)cycle:(float)delta{
[self stepA]
[self stepB]
// etc.
[self stepZ]
}

En algún momento, el paso x hace lo siguiente:

// IRQ is an NSMutableArray
// Self is a reference to the engine running the cycles
[IRQ addObject:^{ NSLog(@"hello! %@", self); } ];

Más adelante, el paso z es procesar todas las llamadas "retrasadas":

            for (int i = 0; i < [IRQ count]; i++){
                void (^delayedCall)(void) = [IRQ objectAtIndex:i];
                delayedCall();
            }

            [IRQ removeAllObjects];

Resultado: EXEC_BAD_ACCESS

Ahora, si el paso x solo agrega una cadena simple sin una referencia de objeto como la siguiente, el paso Z funciona bien:

[IRQ addObject:^{ NSLog(@"hello!"); } ];

Última observación, si un mismo paso agrega bloques a la cola Y itera sobre la cola para ejecutar los bloques, entonces no ocurre ningún problema. Al igual que la referencia a un objeto, se "pierde" a medida que el paso: ¿el método se deja?

¡No entiendo mucho en esta área y necesitaré más ayuda!

edición: James, solo probé lo siguiente para evitar esa referencia cyle:

NSString *userName = @"James";
[IRQ addObject:^{ NSLog(@"hello %@", userName); } ];

Y también sucede. ¿Cómo se aplicaría tu solución a esto?

¡Gracias por adelantado!

Respuestas a la pregunta(3)

Su respuesta a la pregunta