ошибка с использованием блоков в цикле 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 2

1 ответ:

Изменение

[queue addObject:request];

К

[queue addObject:[request copy]];

Обновление: Блоки создаются в стеке. Таким образом, request является локальной переменной. Когда вы добавляете его в NSMutableArray, он сохраняется, но его недостаточно для блоков! Блок будет удален в любом случае, когда вы уйдете {} - не имеет значения, был он сохранен или нет. Вы должны сначала скопировать его в кучу, а затем сохранить (добавив в массив).