Почему 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://www.galloway.me.uk/2013/05/a-look-inside-blocks-episode-3-block-copy/