Почему NSBlocks должны быть скопированы для хранения в контейнерах?

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

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

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

В приведенном выше упрощенном примере я вижу неопределенное поведение, если копирование блока не выполняется. Этот случай специально указан в руководстве Apple по переходу ARC.

Часть, которую я не понимаю,Почему Я должен вручную вызвать копию. Блок создается в стеке, поэтому нужно выполнить block_copy - это ясно. NSArray не вызывает copy, но он должен вызывать retain для объектов, которые добавляются. Так почему же [NSBlock retain] просто не звонит [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/

Ответы на вопрос(2)

Ваш ответ на вопрос