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

考えられる理由の 1 つは、ブロックを失ったことです。ブロックはヒープではなくスタックに作成されます。したがって、ブロックを保持したい場合は、それをコピーする必要があります。これにより、ヒープにブロックのコピーが作成されます。

float (^aVar) = [^{return 0.0;} コピー];

もちろん、後でリリースする必要もあります。

ブロックのコピーの所有者に注意してください。ブロック内では、参照されているすべてのオブジェクトが自動的に保持されます。したがって、参照サイクルを作成するのは簡単です。この問題には __block 修飾子を使用できます。これを読むことを検討してくださいhttp://thirdcog.eu/pwcblocks/

于 2011-02-12T15:47:47.877 に答える