因此,我试图在数组中构建一个块队列,然后在稍后阶段执行队列,该队列是在一个forloop中构建的,该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
}
do块不能用于for循环中的枚举对象(当不在同一个for循环中执行时),或者这看起来像一个bug?
答案 0 :(得分:5)
更改
[queue addObject:request];
到
[queue addObject:[request copy]];
更新:
块是在堆栈中创建的。所以request
是一个局部变量。当你将它添加到NSMutableArray时,它会被保留,但对于块来说还不够!当你离开{}
时,无论如何都会删除阻止 - 无论是否保留,都无关紧要。您应该先将它复制到堆中,然后保留(通过添加到数组中)。