Копирование блоков (т.е.: копирование их к переменным экземпляра) в Objective C

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

Руководство по программированию блоков заставляет его казаться, что я могу сделать, это, при помощи Block_copy / сохраняет для копирования блока далеко, но когда я пытаюсь выполнить его, я разрушаю свою программу.

- (void) setupStoredBlock
{
    int salt = 42;
    m_storedBlock = ^(int incoming){ return 2 + incoming + salt; };
    [m_storedBlock retain];
}

Я пытаюсь назвать его позже:

- (void) runStoredBlock
{
    int outputValue = m_storedBlock(5);
    NSLog(@"When we ran our stored blockwe got back: %d", outputValue);
    [m_storedBlock release];
}

У кого-либо есть какое-либо понимание? (Или, есть ли что-то, что я не получаю с блоками?)

Большое спасибо!

19
задан RyanWilcox 17 September 2011 в 04:47
поделиться

2 ответа

Вместо этого вы захотите сделать следующее:

- (void) setupStoredBlock
{
    int salt = 42;
    m_storedBlock = Block_copy(^(int incoming){ return 2 + incoming + salt; });
}
30
ответ дан 30 November 2019 в 02:52
поделиться

Скопируйте блок, если хотите, чтобы он оставался. Автовыпустите или отпустите его, когда закончите с этим. Сохраните его, если вам нужно долго писать / * NOP * / .

@interface Foo : FooSuper {}
@property(copy) int (^storedBlock)(int);
@end

@implementation Foo
@synthesize storedBlock = mStoredBlock;

- (void)setupStoredBlock {
    self.storedBlock = ^{/*...*/};
    // or: mStoredBlock = [^{/*...*/} copy];
    // but this simple implementation violates the atomicity contract
}

- (void)runStoredBlock {
    int result = self.storedBlock(5);
    NSLog(@"%s: result = %d", __func__, result);
}
@end
6
ответ дан 30 November 2019 в 02:52
поделиться