大多数已记录的块使用示例都演示了使用简单变量的闭包,但是我对任何访问周围代码中存在的对象的尝试都感到困惑。例如,这会以一种丑陋,无益的方式崩溃:
@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());
答案 0 :(得分:1)
一个可能的原因是你已经失去了阻挡。块是在堆栈中创建的,而不是在堆中创建的。所以如果你想保留这个块,你必须复制它;这将在堆中创建块的副本。
float(^ aVar)= [^ {return 0.0;} copy];
当然,您还必须稍后发布。
小心谁拥有该块的副本。在块内,自动保留所有引用的对象。因此很容易创建一个参考周期。您可以使用__block修饰符来解决此问题。请考虑阅读此http://thirdcog.eu/pwcblocks/