开发者

iPhone block scope confusion about accessing object references

Most of the documented examples of block usage demonstrate closure with simple variables, but I've been confou开发者_运维百科nded by any attempts to access objects which are present in the surrounding code. For example, this crashes in an ugly, unhelpful way:

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


One possible reason is that you've lost the block. A block is created in stack, not in the heap. So if you want to keep the block, you have to copy it; this will make a copy of the block in the heap.

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

Of course, you will have to also release it later.

Be careful who owns the copy of the block. Inside a block, all referenced objects are automatically retained. So it is easy to create a reference cycle. You can use __block modifier for this problem. Consider reading this http://thirdcog.eu/pwcblocks/

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜