ошибка с использованием блоков в цикле for с быстрым перечислением
Таким образом, я пытаюсь построить очередь блоков в массиве, а затем выполнить очередь на более позднем этапе, очередь строится в forloop, который использует перечисление строки, используемой в блоке.
NSArray *array = @[@"test", @"if", @"this", @"works"];
NSMutableArray *queue = [NSMutableArray new];
for(id key in array){
//add the work to the queue
void (^ request)() = ^{
NSLog(@"%@", key);
};
[queue addObject:request];
//request(); //this works fine if i just execute the block here, all the strings are printed
}
for(id block in queue){
void (^ request)() = block;
request(); //this just prints 'works' multiple times instead of all the other strings
}
Блоки не работают с перечисляемыми объектами в цикле for (если они не выполняются в том же цикле for), или это похоже на ошибку?
1 ответ:
Изменение
[queue addObject:request];
К
[queue addObject:[request copy]];
Обновление: Блоки создаются в стеке. Таким образом,
request
является локальной переменной. Когда вы добавляете его в NSMutableArray, он сохраняется, но его недостаточно для блоков! Блок будет удален в любом случае, когда вы уйдете{}
- не имеет значения, был он сохранен или нет. Вы должны сначала скопировать его в кучу, а затем сохранить (добавив в массив).