使用快速枚举的for循环中的块的错误

时间:2014-02-25 07:53:33

标签: ios objective-c objective-c-blocks

因此,我试图在数组中构建一个块队列,然后在稍后阶段执行队列,该队列是在一个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?

1 个答案:

答案 0 :(得分:5)

更改

[queue addObject:request];

[queue addObject:[request copy]];

更新: 块是在堆栈中创建的。所以request是一个局部变量。当你将它添加到NSMutableArray时,它会被保留,但对于块来说还不够!当你离开{}时,无论如何都会删除阻止 - 无论是否保留,都无关紧要。您应该先将它复制到堆中,然后保留(通过添加到数组中)。