Tive um problema hoje que me fez perceber que é preciso ter muito cuidado ao usar o qualificador de armazenamento __block. Considere o seguinte código:
__block NSString* string;
dispatch_sync(dispatch_get_main_queue(), ^{
string = [NSString stringWithString:@"I'm autoreleased!"];
});
NSLog(@"My string is: %@", string);
A fila principal fará o ciclo de seu pool de liberação automática antes que o dispatch_sync retorne, deixando um ponteiro pendente no valor da string. Essa linha NSLog definitivamente não fará o que você deseja e pode falhar.
Essa é apenas uma maneira fácil de demonstrar esse problema. Você pode imaginar que qualquer código pegando um bloco pode ter um pool de autorelease no lugar.
Suspeito que o ARC lida melhor com esse caso, mas não tentei. Definitivamente, algo a ter em atenção.
Atualização: Confirmado. No ARC, __block significa forte, então você está seguro nesse caso.