Tenha cuidado com __block e objetos liberados automaticamente

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.