时间捕捉变量值我已经在Objective-C使用GCD以下问题我想不通:为什么这个块不是在创建
我使用下面的方法来计算的东西一些648瓦。 要首先处理的图块的顺序是通过设置变量“pi”的某种算法给出的。变量“loaded”在这种情况下是全局的,并且从0开始并且正确地上升到647.
当不使用块时,一切正常。
while (loaded < [self.tiles count]) {
long pi = /* tricky way to calculate the position index to set */;
NSLog(@"loaded: %d", loaded);
// Do this in a separate thread
dispatch_async(loader, ^{
NSLog(@"loaded ->: %d", loaded);
[self.tiles[loaded] setPositionIndexTo:pi];
});
loaded++;
}
问题:
我得到一个例外,因为该块试图访问self.tiles [648]! 在Apple的块文档中,我们知道块的变量值是在创建块时捕获的,所以我不明白,这甚至是可能的。我明白,加载的变量最终确实具有值648,它应该中止循环而不执行。另一些奇怪的情况是,块0中也没有使用值0,但它始于1.有时也可能看到块在加载值的循环之前,有时会丢失所有值,或者做两次。这里有一些输出:
loaded ->: 612
loaded: 613
loaded ->: 613
loaded ->: 614
loaded: 614
loaded ->: 614
loaded: 615
loaded: 616
loaded ->: 615
loaded: 617
loaded ->: 617
为什么以及这怎么可能?
感谢您的任何澄清,因为我认为苹果的文档明确指出,创建该块时,应该捕获“已加载”的值,而不会再为该块进行更改。
你可以显示'loaded'和'loader'的声明吗? – 2013-02-27 17:38:44
它在类的私有接口中:** @ interface RasterMap(){ int loaded; } ** ____但是我也尝试过我能想到的每种变体的属性。 – 2013-02-27 17:40:10
它是异步模块,看看关于GCD的WWDC 2012视频 - 完全相同!这是正常的原因,所有异步的东西从mainthread前进(并行),你可以知道什么时候。 – iiFreeman 2013-02-27 17:40:21