1

大多数记录在案的块使用示例都演示了使用简单变量的闭包,但我对任何访问周围代码中存在的对象的尝试感到困惑。例如,这会以一种丑陋、无益的方式崩溃:

@interface VisualizerPreset : EyeCandyPreset {
    float changeSourceRate;
    float (^frontPanelSlider2DisplayValueBlock)(void);   
}

....

VisualizerPreset *it;
it = [[VisualizerPreset alloc] init];
it.changeSourceRate = 0.4;

it.frontPanelSlider2DisplayValueBlock = ^(void) {
    return it.changeSourceRate; 
};

....


// this crashes
NSLog(@"%f",it.frontPanelSlider2DisplayValueBlock());
4

1 回答 1

1

一个可能的原因是您丢失了块。块是在堆栈中创建的,而不是在堆中。因此,如果您想保留该块,则必须复制它;这将在堆中复制块。

float (^aVar) = [^{return 0.0;} 复制];

当然,您还必须稍后发布它。

小心谁拥有该块的副本。在一个块内,所有引用的对象都会自动保留。所以很容易创建一个参考循环。你可以使用 __block 修饰符来解决这个问题。考虑阅读此http://thirdcog.eu/pwcblocks/

于 2011-02-12T15:47:47.877 回答