Dlaczego NSBlocks muszą być kopiowane do przechowywania w pojemnikach?

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

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

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

W powyższym uproszczonym przykładzie widzę niezdefiniowane zachowanie, jeśli kopia bloku nie jest wykonywana. Ten futerał jest specjalnie wymieniony w podręczniku przejściowym ARC firmy Apple.

Część, której nie rozumiem, jestczemu Muszę ręcznie wywołać kopię. Blok jest tworzony na stosie, więc trzeba wykonać kopię bloku - to jest jasne. NSArray nie wywołuje kopiowania, ale powinien wywoływać zachowanie na dodanych obiektach. Dlaczego więc [NSBlock nie zachowuje] po prostu przekierowuje do [kopii NSBlock]?

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