Я пытаюсь понять блоки. Я добираюсь, как обычно использовать их при прямой передаче методу. Я интересуюсь теперь взятием блока, хранением, это (говорит) в переменной экземпляра и вызове его позже.
Руководство по программированию блоков заставляет его казаться, что я могу сделать, это, при помощи 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];
}
У кого-либо есть какое-либо понимание? (Или, есть ли что-то, что я не получаю с блоками?)
Большое спасибо!
Вместо этого вы захотите сделать следующее:
- (void) setupStoredBlock
{
int salt = 42;
m_storedBlock = Block_copy(^(int incoming){ return 2 + incoming + salt; });
}
Скопируйте блок, если хотите, чтобы он оставался. Автовыпустите или отпустите его, когда закончите с этим. Сохраните его, если вам нужно долго писать / * 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