iPhone заблокировал путаницу в доступе к ссылкам на объекты - PullRequest
1 голос
/ 12 февраля 2011

Большинство документированных примеров использования блоков демонстрируют закрытие простыми переменными, но меня смутили любые попытки доступа к объектам, присутствующим в окружающем коде. Например, это дает сбой безобразным, бесполезным способом:

@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 Ответ

1 голос
/ 12 февраля 2011

Одной из возможных причин является то, что вы потеряли блок.Блок создается в стеке, а не в куче.Поэтому, если вы хотите сохранить блок, вы должны скопировать его;это создаст копию блока в куче.

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

Конечно, вам также придется освободить егопозже.

Будьте осторожны, кто владеет копией блока.Внутри блока все ссылочные объекты автоматически сохраняются.Так что легко создать референсный цикл.Для этой проблемы вы можете использовать модификатор __block.Вы можете прочитать это http://thirdcog.eu/pwcblocks/

...