iPhone阻止了访问对象引用的范围混乱

时间:2011-02-12 11:12:51

标签: iphone closures objective-c-blocks

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

@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());

1 个答案:

答案 0 :(得分:1)

一个可能的原因是你已经失去了阻挡。块是在堆栈中创建的,而不是在堆中创建的。所以如果你想保留这个块,你必须复制它;这将在堆中创建块的副本。

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

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

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