Por que os NSBlocks precisam ser copiados para armazenamento em contêineres?

- (void) addABlock 
{
void (^aBlock)(void) = ^() { [someObject doSomething]; };

[self.myMutableArray addObject: aBlock];  // Oops..

[self.myMutableArray addObject: [aBlock copy]];  // works fine
}

No exemplo simplificado acima, estou vendo um comportamento indefinido se a cópia do bloco não for executada. Este caso é especificamente listado no guia de transição ARC da apple.

A parte que eu não entendo éporque Eu tenho que chamar manualmente a cópia. O bloco é criado na pilha, então um block_copy precisa ser executado - isso é muito claro. O NSArray não chama cópia, mas deve chamar reter os objetos adicionados. Então, por que [NSBlock retém] simplesmente faz a chamada para [NSBlock copy]?

http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

http://www.galloway.me.uk/2013/05/a-look-inside-blocks-episode-3-block-copy/

questionAnswers(2)

yourAnswerToTheQuestion