ObjC: BAD ACCESS quando blocos de chamadas ^ {} em funções posteriores?

Seguindo istodiscussão, Encontrei um problema de acesso incorreto;

Um loop tem várias etapas: a, b, c, ... x, y, z:

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

Em algum momento, a etapa x faz o seguinte:

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

Posteriormente, o passo z é processar todas as chamadas "atrasadas":

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

            [IRQ removeAllObjects];

Resultado: EXEC_BAD_ACCESS

Agora, se o passo x adicionar apenas uma string simples sem referência de objeto como segue, o passo Z funciona bem:

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

Última observação, se uma mesma etapa adicionar blocos à fila E repetir a fila para executar os blocos, não ocorrerá nenhum problema. Como a referência a um objeto fica "perdida" quando o método step: left é deixado?

Eu não entendo muito nessa área e vou precisar de mais ajuda!

edit: James, apenas tentei o seguinte para evitar o cyle de referência:

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

e isso também acontece. Como sua solução se aplicaria a isso?

Desde já, obrigado!

questionAnswers(3)

yourAnswerToTheQuestion